Middle — Middle+
Jak spravovat transakce v jedné metodě, když je použito několik transakčních operací, s ohledem na kontext provádění?
sobes.tech AI
Odpověď od AI
V Go se pro správu transakcí uvnitř jedné metody s více transakčními operacemi obvykle používá objekt transakce získaný z kontextu databáze (například *sql.Tx). Je důležité tento objekt předat každé funkci, která provádí operace s databází, aby všechny byly součástí jedné transakce.
Pří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 {
// Provádění SQL dotazů přes tx.Exec nebo tx.Query
return nil
}
func operation2(tx *sql.Tx) error {
// Podobně
return nil
}
Tímto způsobem jsou všechny operace prováděny v rámci jedné transakce a při chybě dojde k rollbacku. Kontext provádění (context.Context) lze použít k zrušení nebo nastavení časového limitu, předáváním jej metodám dotazů, ale objekt transakce musí být předán explicitně.