解决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/
作者
puresai
许可协议