Jul
01
2018
【原创】ThinkPHP事务结束问题
TP5中对事务控制的代码如下:
// 启动事务 Db::startTrans(); try{ Db::table('think_user')->find(1); Db::table('think_user')->delete(1); // 提交事务 Db::commit(); } catch (\Exception $e) { // 回滚事务 Db::rollback(); }
小V在开展项目过程中,在try里为了判断业务使用了return返回,却没有对事务进行提交和回滚,初期并没有发现问题。
后来业务转移到后台命令行cli模式常驻内存执行,引发了事务死锁(应该是begin后没有提交与回滚,而连接又没有断开导致死锁) 在初期运行条件中没有暴露问题的原因应该是业务处理完对数据库的连接也就断开了,事务也就自动回滚了。
总结:规范使用事务
- 尽量使用Db::name()的方式操作数据库
- 对业务处理完毕后及时提交或回滚事务
- 可使用抛出异常(throw new \Exception('???'))对事务进行回滚
发表评论: