場景:
對于mysql娄徊,當(dāng)使用InnoDB做引擎時。如果update語句的where條件不是主鍵索引(聚簇索引)寄锐,而是使用非主鍵索引時,會先鎖住當(dāng)前非主鍵索引剩膘,然后再嘗試獲取主鍵索引的鎖;? 如果事務(wù)一: 已經(jīng)鎖住id =1 這一行的主鍵索引和 id = 2這一行的非主鍵索引,嘗試去獲取id=2的主鍵索引的鎖; 事務(wù)二:? 已經(jīng)鎖住id =2 這一行的主鍵索引和 id = 1這一行的非主鍵索引怠褐,嘗試去鎖住id=1這一行的主鍵索引您宪。兩個事務(wù)操作出現(xiàn)相互等待資源的循環(huán),也就是死鎖宪巨。
解決方式:
在一個事務(wù)里面,需要update的時候极祸,先select出所有需要更新的記錄的主鍵,然后再進(jìn)行update遥金,where條件只用主鍵蒜田。所有update語句將會只鎖住主鍵索引,而不會嘗試鎖非主鍵索引物邑。
批注: 我這里講的是如何避免這種死鎖,如果不想用悲觀鎖色解,可以參考我另一篇文章: http://www.reibang.com/p/40a875d6e471