解决webman事务不生效的问题
背景
上周 QA 反馈给我说,任务添加失败了,但任务记录多了一条,我想我用了事务按理不应该啊。
定位
检查代码逻辑
检查项目代码,(使用的 webman )
Db::beginTransaction();
try {
// 省略业务代码
throw new \Exception('mode 错误');
} catch (\Exception $e ) {
Db::rollback();
}
逻辑看似无误,失败后确实提示了,但也确实多了条数据。
查手册
查手册 https://www.workerman.net/doc/webman/others/transaction.html 看到
这里特别需要注意的是必须使用\Throwable而不能使用\Exception,因为业务处理过程中可能触发Error,它并不属于Exception
修改Exception 为 Throwable,本地测试,还是一样的情况。
社区搜索
然后排查是不是connection 指定问题(搜索社区问题),发现我使用的 Model 没有指定,按逻辑是集成了父类
protected $connection = ‘plugin.admin.mysql’;
尝试直接指定下,protected $connection = ‘mysql’;
然后,
Db::connection('mysql')->beginTransaction();
try{
// 省略业务代码
throw new \Exception('mode 错误');
} catch (\Throwable $e) {
Db::connection('mysql')->rollback();
}
再次测试,添加任务失败后,没有新增一条记录,自增值夜添加了一个,说明事务回滚成功了。
好了,这次 debug 说明也恰好写出来具体的排查步骤。你有什么想法,欢迎评论区留言!
解决webman事务不生效的问题
https://blog.puresai.com/2024/08/07/521/