Middle — Middle+
Cum se gestionează tranzacțiile într-o singură metodă atunci când se utilizează mai multe operațiuni tranzacționale, ținând cont de contextul de execuție?
sobes.tech AI
Răspuns de la AI
În Go, pentru gestionarea tranzacțiilor în cadrul unei metode cu mai multe operațiuni tranzacționale, se folosește de obicei un obiect de tranzacție obținut din contextul bazei de date (de exemplu, *sql.Tx). Este important să transmiteți acest obiect în fiecare funcție care efectuează operații cu baza de date, astfel încât toate să facă parte din aceeași tranzacție.
Exemplu:
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 {
// Executarea interogărilor SQL prin tx.Exec sau tx.Query
return nil
}
func operation2(tx *sql.Tx) error {
// Similar
return nil
}
Astfel, toate operațiunile se realizează în cadrul unei singure tranzacții, iar în caz de eroare se face rollback. Contextul de execuție (context.Context) poate fi folosit pentru anulare sau pentru setarea unui timeout, transmitându-l către metodele de interogare, dar obiectul de tranzacție trebuie transmis explicit.