为了账号安全,请及时绑定邮箱和手机立即绑定

如何处理 GORM 提交/回滚错误

如何处理 GORM 提交/回滚错误

Go
Smart猫小萌 2022-07-25 10:10:38
我刚刚发现在 GORM 中,事务提交可能会返回错误,例如:tx := db.begin()// do somthing hereerr := tx.Commit().Error回滚时也会出现tx := db.begin()// do somthing hereerr := tx.Rollback().Error我想知道这个错误是怎么发生的?如果发生,GORM 本身会做任何恢复功能来处理待处理的事务吗?或者如果回滚或提交返回错误,我是否有必要做些什么?顺便说一句,在 GORM 中是否有此类事务问题的最佳实践?
查看完整描述

2 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

我想知道这个错误是怎么发生的?

在完全相同的情况下,您可能会从其他一些数据库调用中收到错误:

  • 网络连接失败

  • 数据库、磁盘或硬件故障

  • 权限问题

  • 命令中的语法错误

  • 数据不一致错误

对于Begin,您的错误选项有些有限,因为(还)没有可能不一致的数据。但是 forCommitRollback任何这些错误都是可能的,以及没有要提交的活动事务的情况(因为先前的错误,因为它已经提交,或者因为它已经回滚)。

如果发生,GORM 本身会做任何恢复功能来处理待处理的事务吗?

不,GORM 不可能,因为它不知道您的应用程序逻辑。与所有类型的所有故障一样,由程序员决定什么是适当的操作。也许你应该重试。也许你应该只重试 N 次。也许您应该忽略失败并像成功一样继续。也许您应该向用户返回一个错误。也许您应该惊慌并崩溃整个程序。GORM 显然无法知道正确的响应。

或者如果回滚或提交返回错误,我是否有必要做些什么?

正如我在上一段中所提到的,只有你才能知道这一点。您的应用程序试图做什么?万一发生故障,正确的做法是什么?

顺便说一句,在 GORM 中是否有此类事务问题的最佳实践?

这与 GORM 无关。处理错误的“最佳实践”只是简单地推断错误表示什么,以及在这种情况下您的应用程序应该做什么。


查看完整回答
反对 回复 2022-07-25
?
米琪卡哇伊

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中使用它的示例


查看完整回答
反对 回复 2022-07-25
  • 2 回答
  • 0 关注
  • 454 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号