麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > MySQL > 正文

mysql報錯:Deadlock found when trying to get lock; try restarting transaction的解決方法

2024-07-24 13:13:55
字體:
來源:轉載
供稿:網友

發現問題

最近在補以前數據的時候程序突然報如下錯誤:

[2017-02-10 13:12:06.678] [INFO] mysql/154562.html">mysqlLog - update tbl_playerdata_error: { [Error: ER_LOCK_DEADLOCK: Deadlock found when trying to get lock; try restarting transaction] code: 'ER_LOCK_DEADLOCK', errno: 1213, sqlState: '40001', index: 0 }

一看就是mysql出現了死鎖問題,其實上面跑的程序在測試服跑了好久都沒什么問題,為什么在正式服上會出現mysql的死鎖問題呢,第一反應是不是數據量太大(3百多萬條),可是也不可能啊,再說死鎖和這些有什么雞毛的關系,看來要好好解決下了。

問題分析

我的分析是:由于現在處理的是正式服的數據,而正式服還有許多用戶在操作,應該是在用戶查詢,或者是其他操作的時候,和我這邊的數據更新產生了死鎖(首先說明使用的是:InnoDB存儲引擎。由于用戶那邊的查詢或者其他操作鎖定了我需要的資源,而我這邊更新也鎖定了用戶操作的一部分資源,兩邊都等著對方釋放資源,從而導致死鎖)。

解決方法

知道錯誤code之后,先來查看mysql的說明,關于上面的 Error: 1213 SQLSTATE: 40001,參見:Server Error Codes and Messages

Message: Deadlock found when trying to get lock; try restarting transactionInnoDB reports this error when a transaction encounters a deadlock and is automatically rolled back so that your application can take corrective action. To recover from this error, run all the operations in this transaction again. A deadlock occurs when requests for locks arrive in inconsistent order between transactions. The transaction that was rolled back released all its locks, and the other transaction can now get all the locks it requested. Thus, when you re-run the transaction that was rolled back, it might have to wait for other transactions to complete, but typically the deadlock does not recur. If you encounter frequent deadlocks, make the sequence of locking operations (LOCK TABLES, SELECT ... FOR UPDATE, and so on) consistent between the different transactions or applications that experience the issue. See Section 14.8.5, “Deadlocks in InnoDB” for details.

上面有兩句:

To recover from this error, run all the operations in this transaction again<br><br>If you encounter frequent deadlocks, make the sequence of locking operations (<code class="literal">LOCK TABLES</code>, <code class="literal">SELECT ... FOR UPDATE</code>, and so on) <br>consistent between the different transactions or applications that experience the issue 

這兩句也就道出了處理死鎖的方法了,我就是在死鎖錯誤發生的時候,使用定時器再重新做一次更新操作,這樣就避免了上面出現的問題。

另外,參考了stack overflow上面一個回答:http://stackoverflow.com/questions/2332768/how-to-avoid-mysql-deadlock-found-when-trying-to-get-lock-try-restarting-trans

One easy trick that can help with most deadlocks is sorting the operations in a specific order.You get a deadlock when two transactions are trying to lock two locks at opposite orders, ie:connection 1: locks key(1), locks key(2);connection 2: locks key(2), locks key(1);If both run at the same time, connection 1 will lock key(1), connection 2 will lock key(2) and each connection will wait for the other to release the key -> deadlock.Now, if you changed your queries such that the connections would lock the keys at the same order, ie:connection 1: locks key(1), locks key(2);connection 2: locks key(1), locks key(2);it will be impossible to get a deadlock.So this is what I suggest:Make sure you have no other queries that lock access more than one key at a time except for the delete statement. if you do (and I suspect you do), order their WHERE in (k1,k2,..kn) in ascending order.Fix your delete statement to work in ascending order:ChangeDELETE FROM onlineusers WHERE datetime <= now() - INTERVAL 900 SECONDToDELETE FROM onlineusers WHERE id IN (SELECT id FROM onlineusers WHERE datetime <= now() - INTERVAL 900 SECOND order by id) u;Another thing to keep in mind is that mysql documentation suggest that in case of a deadlock the client should retry automatically. you can add this logic to your client code. (Say, 3 retries on this particular error before giving up).

參考:http://blog.sina.com.cn/s/blog_4acbd39c01014gsq.html

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久色视频网站 | 羞羞视频免费网站含羞草 | 91精品国产一区二区在线观看 | 黄色男女视频 | 午夜国产在线观看 | 午夜影视一区二区 | 250pp久久新 黄色网址免费在线播放 | 国产精品午夜未成人免费观看 | 成人一级视频在线观看 | 日本中文字幕高清 | 福利在线国产 | 欧美高清在线精品一区二区不卡 | xxxx18韩国护士hd老师 | 久久久久久久久久网 | 欧美精品成人一区二区在线观看 | 精品国产一区二区在线观看 | 精品一区二区三区免费看 | 天堂福利电影 | av电影在线观看网址 | 一区二区久久久久草草 | 国产精品久久久久一区二区 | 49vvv| 欧洲成人一区二区 | 偿还的影视高清在线观看 | 欧美日韩在线视频一区 | gogo全球大胆高清人露出91 | 国产成人高清成人av片在线看 | 久草在线综合 | 久久99精品视频在线观看 | 懂色av懂色aⅴ精彩av | 性爱视频在线免费 | 精品一区二区三区在线观看视频 | 中文字幕网在线 | 国产成人高潮免费观看精品 | 国产精品久久久久久久四虎电影 | 久久久久久久久久美女 | 国产成人自拍av | 激情五月少妇a | 在线播放视频一区二区 | 欧美日韩在线播放一区 | 亚洲成人中文字幕在线 |