亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何處理 GORM 提交/回滾錯誤

如何處理 GORM 提交/回滾錯誤

Go
眼眸繁星 2022-08-01 10:18:06
我剛剛發現在GORM中,事務提交可能會返回錯誤,例如:tx := db.begin()// do somthing hereerr := tx.Commit().Error回滾時也會出現tx := db.begin()// do somthing hereerr := tx.Rollback().Error我想知道這個錯誤是如何發生的?如果發生這種情況,GORM本身會做任何恢復功能來處理待處理的交易嗎?或者,如果回滾或提交返回錯誤,我是否有必要執行某些操作?順便說一句,對于GORM中的此類交易問題,是否有任何最佳實踐?
查看完整描述

2 回答

?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

我想知道這個錯誤是如何發生的?

在完全相同的情況下,您可能會從其他一些數據庫調用中獲得錯誤:

  • 網絡連接失敗

  • 數據庫、磁盤或硬件故障

  • 權限問題

  • 命令中的語法錯誤

  • 數據不一致錯誤

對于 ,您的錯誤選項受到一定限制,因為(尚未)沒有可能不一致的數據。但是,對于 和 任何這些錯誤都是可能的,以及沒有要提交的活動事務的情況(由于以前的錯誤,因為它已經提交,或者因為它已經回滾)。BeginCommitRollback

如果發生這種情況,GORM本身會做任何恢復功能來處理待處理的交易嗎?

不。GORM不可能,因為它不知道你的應用程序邏輯。與所有類型的所有故障一樣,由程序員確定什么是適當的操作。也許你應該重試。也許您只應重試 N 次。也許你應該忽略失敗,繼續,就好像它成功了一樣。也許您應該向用戶返回錯誤。也許你應該恐慌并崩潰整個程序。GORM顯然無法知道正確的反應。

或者,如果回滾或提交返回錯誤,我是否有必要執行某些操作?

正如我在最后一段所回避的,只有你能知道這一點。您的應用程序正在嘗試做什么?在發生故障時,Waht是正確的做法嗎?

順便說一句,對于GORM中的此類交易問題,是否有任何最佳實踐?

這與GORM無關。處理錯誤的“最佳實踐”只是推斷錯誤指示的內容,以及在這種情況下應用程序應該做什么。


查看完整回答
反對 回復 2022-08-01
?
莫回無

TA貢獻1865條經驗 獲得超7個贊

這是代碼


func (db *DB) Rollback() *DB {

    if committer, ok := db.Statement.ConnPool.(TxCommitter); ok && committer != nil {

        if !reflect.ValueOf(committer).IsNil() {

            db.AddError(committer.Rollback())

        }

    } else {

        db.AddError(ErrInvalidTransaction)

    }

    return db

}

因此,這僅檢查實例是否從方法生成,并且不是普通實例。因此,在回滾的情況下,錯誤檢查并不重要(但當然建議使用)txBegin()*gorm.DB


當然,您應該檢查錯誤,因為提交是在事務期間執行所有數據庫交互。因此,如果其中任何一個返回錯誤,則錯誤將允許您訪問該錯誤。.Commit().Commit()


下面是從文檔 https://gorm.io/docs/transactions.html#A-Specific-Example


查看完整回答
反對 回復 2022-08-01
  • 2 回答
  • 0 關注
  • 281 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號