首頁 > 後端開發 > Golang > 如何安全地確定資料庫/sql 事務的狀態而不出現錯誤?

如何安全地確定資料庫/sql 事務的狀態而不出現錯誤?

Barbara Streisand
發布: 2024-12-12 22:47:18
原創
297 人瀏覽過

How Can I Safely Determine the Status of a database/sql Transaction Without Errors?

資料庫/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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板