Mysql next-locking 間隙鎖

longqidong發表於2013-01-30
mysql  innodb間隙鎖就是不僅僅鎖住所需要的行(如果鎖住的這行不存在)還會鎖住一個範圍的行,這個範圍依據鎖住的這行而定。上下剛好是兩個相鄰索引葉節點的範圍。包含下範圍,不包含上範圍。
eg:
t表的x列有索引,
session 1:
mysql> select x,a from t where x>200 for update;
+-------+------+
| x     | a    |
+-------+------+
|   202 | NULL |
|   202 | NULL |
|   300 | NULL |
|   300 | NULL |
|   500 | NULL |
|  3040 | NULL |
|  3040 | NULL |
| 30401 | NULL |
+-------+------+
8 rows in set (0.00 sec)

mysql> update t set a=600 where x=501;
Query OK, 1 row affected (8.55 sec)
Rows matched: 1  Changed: 1  Warnings: 0
這樣就會鎖住 [500,3040)  測試中501下界是500,上界是3039
此時插入x值[500,3030)範圍時,會等待

session 2:
mysql> insert into t(x) values(500);
等待
mysql> insert into t(x) values(400);
Query OK, 1 row affected (0.00 sec)  400不在這個範圍中間,可以插入
mysql> insert into t(x) values(600);
等待
mysql> insert into t(x) values(3040);
Query OK, 1 row affected (0.00 sec)   3040不在這個範圍


間隙鎖是否起作用,還有一個引數 innodb_locks_unsafe_for_binlog
起作用。
預設是關閉的,即間隙鎖是起作用的,
設定為1 ,間隙鎖不起作用,但是開啟這個引數會對binlog的記錄順序產生一定影響,從而在複製和恢復時,就會導致資料不一致,這點需要注意。
這個引數不能動態修改,只能在引數檔案中設定,然後重啟mysql服務生效。


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

相關文章