如何開啟和關閉MySQL 間隙鎖(gap lock)

chenfeng發表於2017-07-03
MySQL InnoDB支援三種行鎖定方式:
行鎖(Record Lock):鎖直接加在索引記錄上面。
間隙鎖(Gap Lock):鎖加在不存在的空閒空間,可以是兩個索引記錄之間,也可能是第一個索引記錄之前或最後一個索引之後的空間。
Next-Key Lock:行鎖與間隙鎖組合起來用就叫做Next-Key Lock。

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


間隙鎖在InnoDB的唯一作用就是防止其它事務的插入操作,以此來達到防止幻讀的發生,所以間隙鎖不分什麼共享鎖與排它鎖。
 
要禁止間隙鎖的話,可以把隔離級別降為讀已提交,或者開啟引數innodb_locks_unsafe_for_binlog。

檢視是否開啟間隙鎖:
mysql> show variables like 'innodb_locks_unsafe_for_binlog';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_locks_unsafe_for_binlog | OFF   |
+--------------------------------+-------+
innodb_locks_unsafe_for_binlog:預設值為0,即啟用gap lock。


這個引數最主要的作用就是控制innodb是否對gap加鎖。
但是,這一設定變更並不影響外來鍵和唯一索引(含主鍵)對gap進行加鎖的需要。
開啟innodb_locks_unsafe_for_binlog的REPEATABLE-READ事務隔離級別,很大程度上已經蛻變成了READ-COMMITTED。


關閉間隙鎖(gap lock)方法:
在my.cnf裡面的[mysqld]新增
[mysqld]
innodb_locks_unsafe_for_binlog = 1


重啟MySQL後生效.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2141515/,如需轉載,請註明出處,否則將追究法律責任。

相關文章