報(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
看看這篇帖子
可以裝一下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; } }
存在unique索引的表在多進(jìn)程INSERT的時(shí)候,即使不用事務(wù)也會(huì)出現(xiàn)deadlock的,而且這是最容易復(fù)現(xiàn)的
因?yàn)閱蝹€(gè)語句的操作,也是一個(gè)事務(wù),只是不用顯式的begin/commit/rolback transaction而已
看報(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ā)情況。
不會(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ò)誤了
例如方法出現(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
這個(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è)引起的。