2 回答

TA貢獻1853條經驗 獲得超18個贊
我想知道這個錯誤是怎么發生的?
在完全相同的情況下,您可能會從其他一些數據庫調用中收到錯誤:
網絡連接失敗
數據庫、磁盤或硬件故障
權限問題
命令中的語法錯誤
數據不一致錯誤
對于Begin
,您的錯誤選項有些有限,因為(還)沒有可能不一致的數據。但是 forCommit
和Rollback
任何這些錯誤都是可能的,以及沒有要提交的活動事務的情況(因為先前的錯誤,因為它已經提交,或者因為它已經回滾)。
如果發生,GORM 本身會做任何恢復功能來處理待處理的事務嗎?
不,GORM 不可能,因為它不知道您的應用程序邏輯。與所有類型的所有故障一樣,由程序員決定什么是適當的操作。也許你應該重試。也許你應該只重試 N 次。也許您應該忽略失敗并像成功一樣繼續。也許您應該向用戶返回一個錯誤。也許您應該驚慌并崩潰整個程序。GORM 顯然無法知道正確的響應。
或者如果回滾或提交返回錯誤,我是否有必要做些什么?
正如我在上一段中所提到的,只有你才能知道這一點。您的應用程序試圖做什么?萬一發生故障,正確的做法是什么?
順便說一句,在 GORM 中是否有此類事務問題的最佳實踐?
這與 GORM 無關。處理錯誤的“最佳實踐”只是簡單地推斷錯誤表示什么,以及在這種情況下您的應用程序應該做什么。

TA貢獻1998條經驗 獲得超6個贊
這是代碼
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
}
所以這只檢查tx實例是否是從Begin()方法生成的并且不是一個普通的*gorm.DB實例。所以在回滾的情況下,錯誤檢查并不重要(但當然推薦)
當然.Commit(),您應該檢查錯誤,因為提交會在事務期間進行所有數據庫交互。因此,如果其中任何一個返回錯誤.Commit(),則錯誤將使您可以訪問該錯誤。
這是文檔https://gorm.io/docs/transactions.html#A-Specific-Example中使用它的示例
- 2 回答
- 0 關注
- 451 瀏覽
添加回答
舉報