在使用beego的orm的过程中,基本是使用文档进行开发,但是有一处我没有细看文档,于是在开发的过程中,就产生了一些疑问,有这些疑问后,我就要清楚到底是怎么回事
疑问一
如果在beego框架中的controller中开启了事务,既不进行提交事务,也不进行回滚事务,会发生什么?
示例代码一
func (controller *CalendarController) Test() {
//此处开启事务 tx, err := global.ORM.Begin() logs.Info(err) //此处更新一条数据 exec, err := tx.Raw("update event_batch set next_time=10 where id=1").Exec() logs.Info(exec,err) if err != nil {
return } if true {
//err := tx.Rollback() logs.Info(err) goto ERR } //tx.Commit() //成功返回 controller.Data["json"] = global.OutMsgFormat(0, "success", nil, nil) _ = controller.ServeJSON() return ERR: //返回错误提示 controller.Data["json"] = global.OutMsgFormat(1002, " 出错了", nil, nil) _ = controller.ServeJSON() }
讯享网
此时访问这个接口,则会直接返回
讯享网{
"code": 1002, "params": null, "reason": " 出错了", "result": null }
此时我们通过mysql客户端进行更新这条数据,则会发现这条语句会一直卡住,最后得到错误Lock wait timeout exceeded; try restarting transaction,很明显,这条数据被之前的事务锁住了,还会带来的一个影响就是我们重新请求这个接口,也会被卡住,直到超时。
以下是发生的错误的截图

- 运行sql卡住

- 运行sql报错

- 访问接口卡住

结论一
之前想当然的认为,发生错误后直接goto ERR,返回,则此进程结束,事务不显示的回滚,那么也没有进行提交,则不会有问题,这在php的开发过程中都是如此写的,但是经过实验发现,必须显示的进行事务回滚,否则这个事务则会一直存在,直到把这个go项目进行重启。
踩坑二
func (controller *CalendarController) Test() {
//此处开启事务 tx, err := global.ORM.Begin() logs.Info(err) //此处更新一条数据 //注意⚠️⚠️⚠️,此处使用的是global.ORM进行更新操作,那么此时事务是没有任何作用的 exec, err := global.ORM.Raw("update event_batch set next_time=10 where id=1").Exec() logs.Info(exec,err) if err != nil {
return } if true {
//err := tx.Rollback() logs.Info(err) goto ERR } //tx.Commit() //成功返回 controller.Data["json"] = global.OutMsgFormat(0, "success", nil, nil) _ = controller.ServeJSON() return ERR: //返回错误提示 controller.Data["json"] = global.OutMsgFormat(1002, " 出错了", nil, nil) _ = controller.ServeJSON() }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/125870.html