MySQL更新死鎖問題
作為一個社交類的 App ,我們有很多操作都會同時發生,為了確保數據的一致性,會采用數據庫的事物。
比如現在我們有一個點贊操作,點贊成功后,需要更改文章的熱度。以下是 SQL 語句:
INSERT INTO user_praise(uid,plan_id,stage_id) VALUES(123456,14456,10023);
UPDATE plan_hot SET hot = hot + 1 WHERE plan_id = 14456;
在這里我們需要用到事物來確保它的原子性,也就是要么這兩條語句全部執行成功,要么就全部回滾。
問題出現
在本地這么測試后,發現并沒有出現什么問題,但是部署上線后,打印出了錯誤日志,如下
### Error updating database. ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction ### The error occurred while setting parameters SQL: UPDATE plan_hot SET hot = hot + 1 WHERE plan_id = ?;
錯誤中提示下面的更新語句出現了死鎖
UPDATE plan_hot SET hot = hot + 1 WHERE plan_id = ?;
該問題是第一次遇到,大概也知道是哪里出現了死鎖,就是更新 hot = hot + 1 的時候,hot 可能會被一個鎖鎖住,而下一個操作就需要等待釋放鎖,然后才能獲取到 hot 的值,進行 hot = hot + 1。如果操作過快的話,可能就會造成死鎖。
但是還是不懂為什么會這樣,根本原因是什么,于是查資料,發現有一個小伙伴解釋得蠻清晰的,下面是他的博文。
分析解決
問題分析及解決方案參考
謝謝他的分享,也希望更多的朋友能分享經驗。
來自:http://kuka.im/2016/08/25/mysql-update-dead-lock/
本文由用戶 hsmen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!