表里面只有id=1,status=1的一条记录,正常逻辑就该是回归,数据不变,但是,db事务没启作用,id=1的status变成0了
这是结果 {"msg":"{\"result1\":1,\"result2\":0}"}
public function test(Request $request): \support\Response
{
Db::beginTransaction();
try {
$result1 = Db::table(Admin::$table)->whereRaw('id = 1')->update(['status' => 0]);
$result2 = Db::table(Admin::$table)->whereRaw('id = 0')->update(['status' => 0]);
if ($result1 && $result2) {
Db::commit();
return json(['result1' => $result1, 'result2' => $result2]);
}
throw new BusinessException(json_encode(['result1' => $result1, 'result2' => $result2]));
} catch (BusinessException $exception ) {
Db::rollback();
return json(['msg' => $exception->getMessage()]);
}
}
ubuntu22.04 docker环境
php 8.1
webman 1.5.7
mysql 8.0
你这个逻辑看起来有bug
1、根据你的描述,数据库只有一个id为1的记录,那么$result2永远是0,
if ($result1 && $result2)
永远无法进入,必然得到你现在的结果2、非常重要的一点,使用事务一定要用
这样的结构来处理事务,只catch BusinessException 是不对的,因为可能产生其他异常或Error就无法捕获,导致后面的所有数据库操作都有问题。
问题发现了,是表引擎是myisam的,改成innodb就好了。老系统重构,没注意表
id还可以使用0