mysql update 引發(fā)很隱蔽的死鎖問題

場景:

對于mysql,當使用InnoDB做引擎時。如果update語句的where條件不是主鍵索引(聚簇索引),而是使用非主鍵索引時,會先鎖住當前非主鍵索引,然后再嘗試獲取主鍵索引的鎖;? 如果事務一: 已經鎖住id =1 這一行的主鍵索引和 id = 2這一行的非主鍵索引,嘗試去獲取id=2的主鍵索引的鎖; 事務二:? 已經鎖住id =2 這一行的主鍵索引和 id = 1這一行的非主鍵索引,嘗試去鎖住id=1這一行的主鍵索引。兩個事務操作出現相互等待資源的循環(huán),也就是死鎖。


死鎖場景

解決方式:

在一個事務里面,需要update的時候,先select出所有需要更新的記錄的主鍵,然后再進行update,where條件只用主鍵。所有update語句將會只鎖住主鍵索引,而不會嘗試鎖非主鍵索引。

批注: 我這里講的是如何避免這種死鎖,如果不想用悲觀鎖,可以參考我另一篇文章: http://www.itdecent.cn/p/40a875d6e471

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容