mysql間隙鎖 mysql間隙鎖

2021-10-25 14:51:30 字數 2387 閱讀 9613

前面一文 mysql鎖 介紹了mysql innodb儲存引擎的各種鎖,本文介紹一下innodb儲存引擎的間隙鎖,就以下問題展開討論

1.什麼是間隙鎖?間隙鎖是怎樣產生的?

2.間隙鎖有什麼作用?

3.使用間隙鎖有什麼隱患?

一、間隙鎖的基本概念

1.什麼叫間隙鎖

當我們用範圍條件而不是相等條件檢索資料,並請求共享或排他鎖時,innodb會給符合條件的已有資料記錄的索引項加鎖;對於鍵值在條件範圍內但不存在的記錄,叫做「間隙(gap)」,innodb也會對這個「間隙」加鎖,這種鎖機制就是所謂的間隙鎖(next-key)鎖。

2.間隙鎖的產生

上面的文字很抽象,現在舉個栗子,介紹間隙鎖是怎麼產生的:

假設有以下表t_student:(其中id為pk,name為非唯一索引)

idname

***address

zhaoyi

beijin

sunsan

shanghai

lisi

guangzhou

zhouwu

shenzhen

wuliu

hangzhou

這個時候我們發出一條這樣的加鎖sql語句:

select id,name from t_student where id > 0 and id < 5 for update;

這時候,我們命中的資料為以下著色部分:

idname

***address

zhaoyi

beijin

sunsan

shanghai

lisi

guangzhou

zhouwu

shenzhen

wuliu

hangzhou

細心的朋友可能就會發現,這裡缺少了條id為2的記錄,我們的重點就在這裡。

select ... for update這條語句,是會對資料記錄加鎖的,這裡因為命中了索引,加的是行鎖。從資料記錄來看,這裡排它鎖鎖住資料是id為1、3和4的這3條資料。

但是,看看前面我們的介紹——對於鍵值在條件範圍內但不存在的記錄,叫做「間隙(gap)」,innodb也會對這個「間隙」加鎖。

好了,我們這裡,鍵值在條件範圍但是不存在的記錄,就是id為2的記錄,這裡會對id為2資料加上間隙鎖。假設這時候如果有id=2的記錄insert進來了,是要等到這個事務結束以後才會執行的

二、間隙鎖的作用

總的來說,有2個作用:防止幻讀和防止資料誤刪/改

1.防止幻讀

假設有下面場景

時間事務a

事務bt1

select count(1) from t_student where id > 1;

t2insert into t_student values(2,'qianer',1,'nanjing');

t3commit;

t4select count(1) from t_student where id > 1;

t5commit;

如果沒有間隙鎖,事務a在t1和t4讀到的結果是不一樣的,有了間隙鎖,讀的就是一樣的了

2.防止資料誤刪/改

這個作用比較重要,假設以下場景:

時間事務a

事務bt1

delete from t_student where id < 4;

t2insert into t_student values(2,'qianer',1,'nanjing');

t3commit;

t4commit;

這種情況下,如果沒有間隙鎖,會出現的問題是:id為2的記錄,剛加進去,就被刪除了,這種情況有時候對業務,是致命性的打擊。加了間隙鎖之後,由於insert語句要等待事務a執行完之後釋放鎖,避免了這種情況

三.使用間隙鎖的隱患

最大的隱患就是效能問題

前面提到,假設這時候如果有id=2的記錄insert進來了,是要等到這個事務結束以後才會執行的,假設是這種場景

時間事務a

事務bt1

select * from t_student where id>1 and id < 100 for update;

t2insert into t_student values(2,'qianer',1,'nanjing');

t3update t_student set ***x where id=***;

t4update t_student set ***x where id=***;

t5update t_student set ***x where id=***;

t6t7

commit;

這種情況,對插入的效能就有很大影響了,必須等到事務結束才能進行插入,效能大打折扣

更有甚者,如果間隙鎖出現死鎖的情況下,會更隱晦,更難定位

mysql 間隙鎖 mysql間隙鎖 轉

前面一文 mysql鎖 介紹了mysql innodb儲存引擎的各種鎖,本文介紹一下innodb儲存引擎的間隙鎖,就以下問題展開討論 1.什麼是間隙鎖?間隙鎖是怎樣產生的?2.間隙鎖有什麼作用?3.使用間隙鎖有什麼隱患?一 間隙鎖的基本概念 1.什麼叫間隙鎖 當我們用範圍條件而不是相等條件檢索資料,...

mysql間隙鎖 mysql的間隙鎖

最近學習了mysql的各種鎖,有點暈,打算通過文章的方式捋一捋。在學習了mvcc後,我就想,他已經很好的解決了併發讀寫了,但我也知道innodb提供了多種型別的鎖,所以很好奇這些鎖有什麼用,為什麼這些鎖的功能是mvcc做不到的?本文討論的都是rr級別下的鎖 我先建立乙個表,並插入幾行資料,如下圖 插...

MySQL間隙鎖問題

間隙鎖 gap lock 鎖加在不存在的空閒空間,可以是兩個索引記錄之間,也可能是第乙個索引記錄之前或最後乙個索引之後的空間。最近使用者反饋說系統老是出現insert時,等待超時了,最後發現是insert間隙鎖!間隙鎖是innodb中行鎖的一種,但是這種鎖鎖住的卻不止一行資料,他鎖住的是多行,是乙個...