与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()就只需要写一次,而具体逻辑的写法就跟没有事务的写法一样了。