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

webman mysql 多進(jìn)程 死鎖

workers

問題描述

報(bào)錯(cuò):【SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction】

webman的項(xiàng)目,偶爾報(bào)這個(gè)錯(cuò)誤,經(jīng)檢查代碼里并沒有使用事務(wù),請(qǐng)問下:webman的多進(jìn)程模型,并發(fā)高的時(shí)候是否可能出現(xiàn)操作同一數(shù)據(jù)表時(shí)發(fā)生死鎖的情況?
這種情況該怎么解決了
webman版本1.4.3
webman/think-orm 1.0
截圖

2812 4 1
4個(gè)回答

evilk
  • workers 2023-05-25

    我代碼里面并沒有用到事務(wù)呀

  • evilk 2023-05-25

    可以裝一下webman官方的日志插件
    里面有一段代碼是"判斷Db是否有未提交的事務(wù)"
    可以先嘗試一下
    // 判斷Db是否有未提交的事務(wù) $has_uncommitted_transaction = false; if (class_exists(Connection::class, false)) { if ($log = $this->checkDbUncommittedTransaction()) { $has_uncommitted_transaction = true; $method = 'error'; $logs .= $log; } }

小W

我前兩天也遇到了,就是事務(wù)未提交或者回滾導(dǎo)致的死鎖

  • workers 2023-05-25

    我代碼里面并沒有用到事務(wù)呀

nitron

存在unique索引的表在多進(jìn)程INSERT的時(shí)候,即使不用事務(wù)也會(huì)出現(xiàn)deadlock的,而且這是最容易復(fù)現(xiàn)的

因?yàn)閱蝹€(gè)語句的操作,也是一個(gè)事務(wù),只是不用顯式的begin/commit/rolback transaction而已

  • workers 2023-05-25

    看報(bào)錯(cuò)請(qǐng)求的trace 定位的是一條查詢語句
    ModelLeave::update(array("reads" => $v['reads'] . $member['id'] . ','), ['id' => $v['id']]);
    但是從我業(yè)務(wù)邏輯上分析 這個(gè)修改應(yīng)該只會(huì)有一個(gè)人,也就是一個(gè)進(jìn)程來操作 不應(yīng)該會(huì)出現(xiàn)并發(fā)情況。

  • tanhongbin 2023-05-25

    沒遇到過,多進(jìn)程同時(shí)處理也不會(huì)出現(xiàn)死鎖呀,update自帶排它鎖,你是按照主鍵修改的嘛?

  • workers 2023-05-25

    是按照主鍵修改的

  • tanhongbin 2023-05-25

    那不應(yīng)該呀,按照主鍵修改 都是自帶排它鎖的,不應(yīng)該出現(xiàn)死鎖呀

  • 小W 2023-05-25

    update之前會(huì)不會(huì)就已經(jīng)死鎖了

  • tanhongbin 2023-05-25

    這個(gè)有可能呀,樓主還得自己排查一下

  • workers 2023-05-25

    不會(huì)是因?yàn)閡pdate之前死鎖的 剛又出現(xiàn)了一次 是另一個(gè)方法 里面只有三行sql查詢
    $is = Distance::where([['name', '=', $member['name']]])->findOrEmpty()->toArray();
    if ($is) {
    Distance::where([['id', '=', $is['id']]])->update(array('name' => $member['name'], 'lat' => $lat, 'lon' => $lon, 'res' => $distance, 'addtime' => date('Y-m-d H:i:s')));
    } else {
    Distance::create(array('name' => $member['name'], 'lat' => $lat, 'lon' => $lon, 'res' => $distance, 'addtime' => date('Y-m-d H:i:s')));
    }
    其中update那行又報(bào)死鎖錯(cuò)誤了

  • tanhongbin 2023-05-25

    這里的name 是不是唯一索引??

  • workers 2023-05-25

    name不是唯一索引,id是主鍵,innodb表,沒有任何索引

  • tanhongbin 2023-05-25

    你得在檢查一下是否 其他方法中有事務(wù)沒有提交,同一個(gè)進(jìn)程 一個(gè)mysql連接,會(huì)影響其他方法

  • tanhongbin 2023-05-25

    例如方法出現(xiàn)bug導(dǎo)致 事務(wù)開啟后 報(bào)錯(cuò)代碼停止了,這個(gè)時(shí)候事務(wù)就是沒有提交,會(huì)導(dǎo)致當(dāng)前進(jìn)程 所有方法 中的事務(wù)等待,會(huì)顯示超時(shí),所以最好在使用事務(wù)時(shí)候,使用try catch

  • nitron 2023-05-25

    查MSQL的日志看吧,空對(duì)空沒意義

meows

這個(gè)問題和thinkorm webman 沒任何關(guān)系,僅僅是你SQL語句寫的有問題。
這種錯(cuò)誤“QLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction”,
本質(zhì)含義,開啟事務(wù)長時(shí)間未提交,大概率有記錄被鎖住,沒有辦法被提交釋放鎖,導(dǎo)致這個(gè)事務(wù)被撤銷。
你沒有開啟事務(wù),但是INNODB默認(rèn)會(huì)開啟事務(wù)。
你應(yīng)該bing.com 搜索“mysql 死鎖 事務(wù)長時(shí)間超時(shí)撤銷”關(guān)鍵詞去找一下答案,你要定位到引起鎖的SQL語句是什么,然后分析原因。你這樣報(bào)告thinkorm webman 版本沒太多意義,這個(gè)問題不是這兩個(gè)引起的。

  • 暫無評(píng)論
年代過于久遠(yuǎn),無法發(fā)表回答
??