Middle — Middle+
Kaip valdyti sandorius vienoje metodoje, kai naudojama kelios sandorių operacijos, atsižvelgiant į vykdymo kontekstą?
sobes.tech AI
Atsakymas iš AI
Go kalboje, norint valdyti transakcijas vieno metodo viduje su keliomis transakcijos operacijomis, paprastai naudojamas transakcijos objektas, gautas iš duomenų bazės konteksto (pavyzdžiui, *sql.Tx). Svarbu šį objektą perduoti kiekvienai funkcijai, kuri vykdo su duomenų baze susijusias operacijas, kad visi jie būtų vienos transakcijos dalis.
Pavyzdys:
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 {
// Vykdyti SQL užklausas naudojant tx.Exec arba tx.Query
return nil
}
func operation2(tx *sql.Tx) error {
// Panašiai
return nil
}
Taip, visi veiksmai vykdomi vienos transakcijos rėmuose, ir klaidos atveju atliekamas rollback. Vykdymo kontekstas (context.Context) gali būti naudojamas atšaukti arba nustatyti laiką limitą, perduodant jį į užklausų metodus, tačiau transakcijos objektas turi būti aiškiai perduotas.