mysql 間隙鎖 Gap Lock

來源:互聯網
上載者:User

標籤:mysql 間隙鎖 gap lock

  MySQL InnoDB支援三種行鎖定方式:

行鎖(Record Lock):鎖直接加在索引記錄上面。

間隙鎖(Gap Lock):鎖加在不存在的空閑空間,可以是兩個索引記錄之間,也可能是第一個索引記錄之前或最後一個索引之後的空間。

Next-Key Lock:行鎖與間隙鎖組合起來用就叫做Next-Key Lock。

預設情況下,InnoDB工作在可重複讀隔離等級下,並且以Next-Key Lock的方式對資料行進行加鎖,這樣可以有效防止幻讀的發生。Next-Key Lock是行鎖與間隙鎖的組合,這樣,當InnoDB掃描索引記錄的時候,會首先對選中的索引記錄加上行鎖(Record Lock),再對索引記錄兩邊的間隙(向左掃描掃到第一個比給定參數小的值, 向右掃描掃描到第一個比給定參數大的值, 然後以此為界,構建一個區間)加上間隙鎖(Gap Lock)。如果一個間隙被事務T1加了鎖,其它事務是不能在這個間隙插入記錄的。

舉個例子:

表task_queue

Id           taskId

1              2

3              9

10            20

40            41


開啟一個會話: session 1

sql> set autocommit=0;

   ##

取消自動認可

sql> delete from task_queue where taskId = 20;

sql> insert into task_queue values(20, 20);


在開啟一個會話: session 2

sql> set autocommit=0;

   ##

取消自動認可

sql> delete from task_queue where taskId = 25;

sql> insert into task_queue values(30, 25);


在沒有並發,或是極少並發的情況下, 這樣會可能會正常執行,在Mysql中, 事務最終都是穿行執行, 但是在高並發的情況下, 執行的順序就極有可能發生改變, 變成下面這個樣子:

sql> delete from task_queue where taskId = 20;

sql> delete from task_queue where taskId = 25;

sql> insert into task_queue values(20, 20);

sql> insert into task_queue values(30, 25);


這個時候最後一條語句:insert into task_queue values(30, 25); 執行時就會爆出死結錯誤。因為刪除taskId = 20這條記錄的時候,20 --  41 都被鎖住了, 他們都取得了這一個資料區段的共用鎖定, 所以在擷取這個資料區段的排它鎖時出現死結。


間隙鎖在InnoDB的唯一作用就是防止其它事務的插入操作,以此來達到防止幻讀的發生,所以間隙鎖不分什麼共用鎖定與排它鎖。另外,在上面的例子中,我們選擇的是一個普通(非唯一)索引欄位來測試的,這不是隨便選的,因為如果InnoDB掃描的是一個主鍵、或是一個唯一索引的話,那InnoDB只會採用行鎖方式來加鎖,而不會使用Next-Key Lock的方式,也就是說不會對索引之間的間隙加鎖,仔細想想的話,這個並不難理解,大家也可以自己測試一下。

 

要禁止間隙鎖的話,可以把隔離等級降為讀已提交,或者開啟參數innodb_locks_unsafe_for_binlog。


mysql 間隙鎖 Gap Lock

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.