場景:
對于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