顺晟科技
2021-06-16 10:27:40
305
在日常工程中,我们可能要开事务来完成一些操作,因此就会有如下代码:
//更新任务备注更新任务备注
func UpdateTaskRemote(TaskID uint 32,备注字符串)错误{
sql,args,err :=sq .更新('任务')。“Set(”备注,备注)。Set('updated_at ',getNowTS()).其中(' id=?',taskID).ToSql()
如果出错!=零{
返回错误
}
tx,err :=db .Beginx()
如果出错!=零{
返回错误
}
_,err=tx .Exec(sql,args.)
如果出错!=零{
返回错误
}
err=tx .提交()
如果出错!=零{
洛克罗斯。错误('无法提交事务: %s,回滚它,错误)
返回德克萨斯州.回滚()
}
返回零
}
如果只有一个,似乎没有什么问题,但是,一旦操作多了之后,要在每个模型操作函数中都写上这一堆重复的代码,那就不太妙了。因此得想一个办法来进行抽象,把开事务、提交和回滚的操作封装起来。借助闭包我们可以做到这一点:
//工具函数用于在事务中执行,自动提交和回滚
键入TxFunc func(tx *sqlx .Tx)错误
//ExecInTx传入一个闭包函数,签名类型为TxFunc。在ExecInTx中先开事务,
//然后将事务传入闭包函数,如果闭包函数没有返回错误就提交,否则回滚。
func ExecInTx(f TxFunc)错误{
tx,err :=db .Beginx()
如果出错!=零{
返回错误
}
err=f(tx)
如果出错!=零{
返回错误
}
err=tx .提交()
如果出错!=零{
洛克罗斯。错误('无法提交事务: %s,回滚它,错误)
返回德克萨斯州.回滚()
}
返回零
}
由此,型号操作函数就简化成了:
//更新任务备注更新任务备注
func UpdateTaskRemote(TaskID uint 32,备注字符串)错误{
sql,args,err :=sq .更新('任务')。“Set(”备注,备注)。Set('updated_at ',getNowTS()).其中(' id=?',taskID).ToSql()
如果出错!=零{
返回错误
}
返回ExecInTx(func(tx *sqlx .Tx)错误{
_,err :=tx .Exec(sql,args.)
返回错误
})
}
如上。
08
1972-02
02
2022-09
28
2021-08
28
2021-08
28
2021-08
28
2021-08