Middle — Middle+
Ako spravovať transakcie v jednej metóde, keď sa používa viacero transakčných operácií, s ohľadom na kontext vykonávania?
sobes.tech AI
Odpoveď od AI
V Go-u sa správou transakcií v rámci jednej metódy s viacerými transakčnými operáciami sa zvyčajne používa objekt transakcie získaný z kontextu databázy (napríklad *sql.Tx). Je dôležité tento objekt odovzdať každej funkcii, ktorá vykonáva operácie s databázou, aby všetky boli súčasťou jednej transakcie.
Príklad:
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 {
// Vykonávanie SQL dopytov pomocou tx.Exec alebo tx.Query
return nil
}
func operation2(tx *sql.Tx) error {
// Podobne
return nil
}
Týmto spôsobom sa všetky operácie vykonávajú v rámci jednej transakcie a pri chybe sa vykoná rollback. Kontext vykonávania (context.Context) možno použiť na zrušenie alebo nastavenie časového limitu, odovzdávaním do metód dopytov, ale objekt transakcie musí byť explicitne odovzdaný.