golang sql事务rollback写法的思考

与springmvc什么都封装好了不一样,使用go开发的时候很多轮子都得自己造,但也正因为此,go的开发更为自由灵活。

go比较著名的orm库是gorm,在写带有事务的方法,而碰巧业务逻辑又比较复杂的情况下,一旦出现了error,则事务必须回滚,这样的话,代码中将会有很多的tx.Rollback()这样的臃肿代码。

解决方法之一是使用goto,但是golang中的goto要求变量必须声明在开头,不是很方便。

在思考之后,突然想到了defer语句,于是带事务方法的大致结构为:

func (a *A) dummy(b *B) error {
    var err error
    var tx *gorm.DB
    defer func() {
        if err != nil && tx != nil{
            log.Debug(err, "操作撤销")
            tx.Rollback()
        }
    }()
 
    db := a.GetDb()
    tx = db.Begin()
    if yyy2, err = dao.FindXXX(tx, yyy1); err != nil{
        return err
    }
 
    // ...
    if err = dao.Update(tx, xxx1) ; err != nil {
        return err
    }
    if err = dao.Update(tx, xxx2) ; err != nil {
        return err
    }
 
    tx.Commit()
    log.Debug("操作成功。")
    return nil
}


这样,tx.Rollback()就只需要写一次,而具体逻辑的写法就跟没有事务的写法一样了。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值