資料庫/sql Tx:偵測交易狀態
問題:
問題:如何決定使用資料庫/sql的交易是否已提交或回滾而不觸發錯誤?
答案:要偵測交易狀態,請遵循以下最佳實務:
1.將交易保留在函數內:確保在相同函數內呼叫Begin()、Commit() 和Rollback()。這可確保無縫追蹤交易。
2.利用 Defer 來關閉交易:合併延遲函數以在必要時執行回滾。這保證了正確的交易處理。
3.簡潔的事務處理程序:實現事務處理程序函數來封裝事務,確保簡潔正確處理。
import "database/sql" 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) } else if err != nil { tx.Rollback() } else { err = tx.Commit() } }() err = txFunc(tx) return err }
代碼示例:
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 }) }
使用交易handler:
處理恐慌:利用recover()捕捉恐慌並確保及時回滾。如果需要的話,重新引發恐慌以允許處理。
GC 和 Tx 物件:在提交或回滾後將 Tx 設為 nil 不會自動釋放記憶體。相反,依靠垃圾收集器來處理這個問題。以上是如何安全地確定資料庫/sql 事務的狀態而不出現錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!