2 回答
TA贡献1829条经验 获得超7个赞
我想知道这个错误是如何发生的?
在完全相同的情况下,您可能会从其他一些数据库调用中获得错误:
网络连接失败
数据库、磁盘或硬件故障
权限问题
命令中的语法错误
数据不一致错误
对于 ,您的错误选项受到一定限制,因为(尚未)没有可能不一致的数据。但是,对于 和 任何这些错误都是可能的,以及没有要提交的活动事务的情况(由于以前的错误,因为它已经提交,或者因为它已经回滚)。Begin
Commit
Rollback
如果发生这种情况,GORM本身会做任何恢复功能来处理待处理的交易吗?
不。GORM不可能,因为它不知道你的应用程序逻辑。与所有类型的所有故障一样,由程序员确定什么是适当的操作。也许你应该重试。也许您只应重试 N 次。也许你应该忽略失败,继续,就好像它成功了一样。也许您应该向用户返回错误。也许你应该恐慌并崩溃整个程序。GORM显然无法知道正确的反应。
或者,如果回滚或提交返回错误,我是否有必要执行某些操作?
正如我在最后一段所回避的,只有你能知道这一点。您的应用程序正在尝试做什么?在发生故障时,Waht是正确的做法吗?
顺便说一句,对于GORM中的此类交易问题,是否有任何最佳实践?
这与GORM无关。处理错误的“最佳实践”只是推断错误指示的内容,以及在这种情况下应用程序应该做什么。
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
- 2 回答
- 0 关注
- 244 浏览
添加回答
举报