最近項目中發生死鎖問題,發現是mysql爲保證可重讀而使用間隙鎖導致的。
場景是在在一個事務裏面查詢了多條記錄(包括記錄A),而mysql數據庫的隔離機制是可重複讀,爲了保證在這個事務裏這些數據不被其他連接修改。就會吧這些數據加上間隙鎖(範圍鎖)。這時其他線程在另一個事務裏查詢了數據B,(相當於給數據B加間隙鎖),然後想要修改數據A,照成兩個事務互相等待對方釋放鎖,就照成了死鎖。
流程圖如下:
最近項目中發生死鎖問題,發現是mysql爲保證可重讀而使用間隙鎖導致的。
場景是在在一個事務裏面查詢了多條記錄(包括記錄A),而mysql數據庫的隔離機制是可重複讀,爲了保證在這個事務裏這些數據不被其他連接修改。就會吧這些數據加上間隙鎖(範圍鎖)。這時其他線程在另一個事務裏查詢了數據B,(相當於給數據B加間隙鎖),然後想要修改數據A,照成兩個事務互相等待對方釋放鎖,就照成了死鎖。
流程圖如下:
默認的:最高權限用戶:system 密碼:manager(我自己system) 管理員權限用戶:sys 密碼:change_on_install 普通用戶:scott