Heim >Backend-Entwicklung >Golang >Wie kann ich das Festschreiben oder Zurücksetzen von Datenbanktransaktionen im Paket „database/sql' von Go zuverlässig erkennen?
Transaktions-Commit oder Rollback in Datenbank/SQL erkennen
Im Datenbank-/SQL-Paket mit seiner Treiberschnittstelle und dem Tx-Typ ist dies nicht der Fall Es ist explizit möglich, festzustellen, ob eine Transaktion festgeschrieben oder zurückgesetzt wurde, ohne dass eine weitere Transaktion versucht werden muss. Der vom nachfolgenden Versuch zurückgegebene Fehler kann dann untersucht werden, um auf den Status der Transaktion zu schließen.
Um zusätzlichen Overhead zu vermeiden, könnte man erwägen, die Tx-Variable nach einem Commit oder Rollback auf Null zu setzen. Von diesem Ansatz wird jedoch im Allgemeinen abgeraten, da er zu unerwartetem Verhalten und Speicherverlusten führen kann.
Eine empfohlene Lösung besteht darin, einen Transaktionshandler zu verwenden, um die Transaktionslogik zu umgehen. Dadurch wird sichergestellt, dass Begin()-, Commit()- und Rollback()-Aufrufe immer innerhalb derselben Funktion erfolgen, was die Nachverfolgung vereinfacht und eine ordnungsgemäße Transaktionsabwicklung mithilfe von Defer-Anweisungen gewährleistet.
Zum Beispiel:
func Transact(db *sql.DB, txFunc func(*sql.Tx) error) (err error) { tx, err := db.Begin() if err != nil { return } defer func() { if p := recover(); p != nil { tx.Rollback() panic(p) // re-throw panic after Rollback } else if err != nil { tx.Rollback() // err is non-nil; don't change it } else { err = tx.Commit() // err is nil; if Commit returns error update err } }() err = txFunc(tx) return err }
Mit diesem Handler kann die Transaktionslogik wie folgt gekapselt werden:
func (s Service) DoSomething() error { return Transact(s.db, func (tx *sql.Tx) error { if _, err := tx.Exec(...); err != nil { return err } if _, err := tx.Exec(...); err != nil { return err } return nil }) }
Dieser Ansatz hält den Transaktionscode prägnant und gewährleistet eine konsistente Handhabung. Beachten Sie, dass der Transaktionshandler „recover()“ verwendet, um Paniken abzufangen und umgehend einen Rollback einleitet. Es sollte jedoch betont werden, dass das Zurückgeben von Fehlern der Panik vorzuziehen ist.
Das obige ist der detaillierte Inhalt vonWie kann ich das Festschreiben oder Zurücksetzen von Datenbanktransaktionen im Paket „database/sql' von Go zuverlässig erkennen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!