1. 程式人生 > >0913關於間隙鎖的模擬

0913關於間隙鎖的模擬

如果 innodb 上界 _for 兩個 net 順序 模擬 isolation

轉自http://blog.itpub.net/22418990/viewspace-753572/

mysql innodb間隙鎖就是不僅僅鎖住所需要的行(如果鎖住的這行不存在)還會鎖住一個範圍的行,這個範圍依據鎖住的這行而定。上下剛好是兩個相鄰索引葉節點的範圍。包含下範圍,不包含上範圍。

設置服務器的隔離級別 tx_isolation=REPEATABLE-READ

CREATE TABLE t
(`x` INT,a INT)

ALTER TABLE t ADD INDEX idx_x(`x`);

-- 制造數據select x,a from t where x>200

+-------+------+ | 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) session 1: update t set a=600 where x=501; 這樣就會鎖住 [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服務生效。

0913關於間隙鎖的模擬