一分鐘瞭解Mysql的間隙鎖——《深究Mysql鎖》

原文鏈接:https://blog.csdn.net/zcl_love_wx/article/details/82382582

什麼是間隙鎖?

間隙鎖是一個在索引記錄之間的間隙上的鎖。

間隙鎖的作用

保證某個間隙內的數據在鎖定情況下不會發生任何變化。比如我mysql默認隔離級別下的可重複讀(RR)。

當使用唯一索引來搜索唯一行的語句時,不需要間隙鎖定。如下面語句的id列有唯一索引,此時只會對id值爲10的行使用記錄鎖。

select * from t where id = 10 for update;// 注意:普通查詢是快照讀,不需要加鎖

如果,上面語句中id列沒有建立索引或者是非唯一索引時,則語句會產生間隙鎖。

如果,搜索條件裏有多個查詢條件(即使每個列都有唯一索引),也是會有間隙鎖的。

需要注意的是,當id列上沒有索引時,SQL會走聚簇索引的全表掃描進行過濾,由於過濾是在MySQL Server層面進行的。因此每條記錄(無論是否滿足條件)都會被加上X鎖。但是,爲了效率考量,MySQL做了優化,對於不滿足條件的記錄,會在判斷後放鎖,最終持有的,是滿足條件的記錄上的鎖。但是不滿足條件的記錄上的加鎖/放鎖動作是不會省略的。所以在沒有索引時,不滿足條件的數據行會有加鎖又放鎖的耗時過程。

間隙的範圍

根據檢索條件向下尋找最靠近檢索條件的記錄值A作爲左區間,向上尋找最靠近檢索條件的記錄值B作爲右區間,即鎖定的間隙爲(A,B)。

number 1 2 3 4 5 6 6 6 11
id 1 3 5 7 9 10 11 12 23

select * from t where number=6;那麼間隙鎖鎖定的間隙爲:(5,11),所以你再想插入5到11之間的數就會被阻塞。

更需要你注意的是,當你再執行update t set number = 6 where id = 1也會被阻塞。這是爲什麼?你想想看,要保證每次查詢number=6的數據行數不變,如果你將另外一條數據修改成了6,豈不會多了一條?所以此時不會允許任何一條數據被修改成6。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章