Sobes.tech
Middle — Middle+

Hogyan kezeljük a tranzakciókat egy módszeren belül, amikor több tranzakciós műveletet használunk, figyelembe véve a végrehajtási kontextust?

sobes.tech MI

Válasz az MI-től

Go-ban egy módszeren belüli több tranzakciós művelet kezeléséhez általában egy tranzakció objektumot használnak, amelyet az adatbázis kontextusból szereznek (például *sql.Tx). Fontos, hogy ezt az objektumot minden olyan függvénybe átadjuk, amely adatbázis műveleteket végez, hogy mindegyik ugyanannak a tranzakciónak a része legyen.

Példa:

func doComplexOperation(db *sql.DB) error {
    tx, err := db.Begin()
    if err != nil {
        return err
    }
    defer func() {
        if p := recover(); p != nil {
            tx.Rollback()
            panic(p)
        } else if err != nil {
            tx.Rollback()
        } else {
            err = tx.Commit()
        }
    }()

    err = operation1(tx)
    if err != nil {
        return err
    }

    err = operation2(tx)
    if err != nil {
        return err
    }

    return nil
}

func operation1(tx *sql.Tx) error {
    // SQL lekérdezések végrehajtása a tx.Exec vagy tx.Query segítségével
    return nil
}

func operation2(tx *sql.Tx) error {
    // Hasonló
    return nil
}

Így minden művelet ugyanazon tranzakción belül történik, és hiba esetén rollback történik. A végrehajtási kontextus (context.Context) használható a leállításra vagy időkorlát beállítására, amit a lekérdezés módszereknek kell átadni, de a tranzakció objektumot kifejezetten át kell adni.