国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

db事務(wù)沒(méi)啟作用,有沒(méi)有遇到的?怎么解決?

世上走一回

問(wèn)題描述

表里面只有id=1,status=1的一條記錄,正常邏輯就該是回歸,數(shù)據(jù)不變,但是,db事務(wù)沒(méi)啟作用,id=1的status變成0了

這是結(jié)果 {"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()]);
        }
    }

操作系統(tǒng)環(huán)境及workerman/webman等具體版本

ubuntu22.04 docker環(huán)境
php 8.1
webman 1.5.7
mysql 8.0

1006 1 0
1個(gè)回答

keytehu

你這個(gè)邏輯看起來(lái)有bug
1、根據(jù)你的描述,數(shù)據(jù)庫(kù)只有一個(gè)id為1的記錄,那么$result2永遠(yuǎn)是0,if ($result1 && $result2) 永遠(yuǎn)無(wú)法進(jìn)入,必然得到你現(xiàn)在的結(jié)果
2、非常重要的一點(diǎn),使用事務(wù)一定要用

try {

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

這樣的結(jié)構(gòu)來(lái)處理事務(wù),只catch BusinessException 是不對(duì)的,因?yàn)榭赡墚a(chǎn)生其他異?;駿rror就無(wú)法捕獲,導(dǎo)致后面的所有數(shù)據(jù)庫(kù)操作都有問(wèn)題。

  • 世上走一回 2023-08-02

    問(wèn)題發(fā)現(xiàn)了,是表引擎是myisam的,改成innodb就好了。老系統(tǒng)重構(gòu),沒(méi)注意表

  • 小W 2023-08-03

    id還可以使用0

年代過(guò)于久遠(yuǎn),無(wú)法發(fā)表回答
??