標籤:
作為一個社交類的 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 parametersSQL: 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
MySQL更新死結問題