記一次mysql間隙鎖照成死鎖

最近項目中發生死鎖問題,發現是mysql爲保證可重讀而使用間隙鎖導致的。

場景是在在一個事務裏面查詢了多條記錄(包括記錄A),而mysql數據庫的隔離機制是可重複讀,爲了保證在這個事務裏這些數據不被其他連接修改。就會吧這些數據加上間隙鎖(範圍鎖)。這時其他線程在另一個事務裏查詢了數據B,(相當於給數據B加間隙鎖),然後想要修改數據A,照成兩個事務互相等待對方釋放鎖,就照成了死鎖。

流程圖如下:

程序啓動
事務A
事務B
find a 相當於給數據a加間隙鎖
find b 相當於給數據b加間隙鎖
update b 嘗試獲得b的鎖
update a 嘗試獲得a的鎖
死鎖
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章