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。如果操作過快的話,可能就會造成死鎖。

但是還是不懂為什么會這樣,根本原因是什么,於是查資料,發現有一個小伙伴解釋得蠻清晰的,下面是他的博文。

分析解決

問題分析及解決方案參考

MySQL更新死鎖問題

謝謝他的分享,也希望更多的朋友能分享經驗。

http://www.tuicool.com/articles/nQniiaa

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM