db事务没启作用,有没有遇到的?怎么解决?

世上走一回

问题描述

表里面只有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()]);
        }
    }

操作系统环境及workerman/webman等具体版本

ubuntu22.04 docker环境
php 8.1
webman 1.5.7
mysql 8.0

401 1 0
1个回答

keytehu

你这个逻辑看起来有bug
1、根据你的描述,数据库只有一个id为1的记录,那么$result2永远是0,if ($result1 && $result2) 永远无法进入,必然得到你现在的结果
2、非常重要的一点,使用事务一定要用

try {

    Db::commit();
} catch (\Throwable $e) {
    Db::rollback()
}

这样的结构来处理事务,只catch BusinessException 是不对的,因为可能产生其他异常或Error就无法捕获,导致后面的所有数据库操作都有问题。

  • 世上走一回 2023-08-02

    问题发现了,是表引擎是myisam的,改成innodb就好了。老系统重构,没注意表

  • 小W 2023-08-03

    id还可以使用0

🔝