間隙鎖相關問題:
#####################
測試資料:
CREATE TABLE `test` (
`a` int(11) NOT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert into test value(11) ;
insert into test value(14) ;
###########################################
1.什麼是區間鎖(gap)
gap會鎖定某個區間,防止資料的插入,來避免幻影讀。
2.什麼是區間。
例如測試表中的資料11,14. 這些資料包括以下區間:
~到11,11到14,14到~
3.産生區間鎖的相關操作。
update ... where/
delete .. where/
select ...from...lock in share mode/
select .. from .. for update /
都會添加間隙鎖
如果where後面使用的等号(=)就會不會包括臨界值,例如,在 delete from test where a=9 ,區間鎖定範圍在~到11,但是不包括11.
如果where後面使用的大于或是小于就包括臨界值,例如,在 delete from test where a<9 ,區間鎖定範圍在~到11,并且包括11.
4.innodb鎖類型:
Record-lock:鍵值本身
gap:鎖定一個範圍,不包括臨界值
Next-Key-Lock:鎖定一個範圍包括左表的臨界值
為了防止幻覺讀,innodb在插入資料的時候會監測相鄰的兩個範圍(不包含臨界值)是否被鎖定,如果被鎖定就不允許插入。
但是在以下情況下next-key-lock會降級為Record-lock.
1.當查詢中包含唯一索引并且能根據這個值查詢到資料時,next-key-lock會降級為recrod-lock
2.當唯一索引是複合索引時,必須用到索引的所有列,next-key-lock才會降級為recrod-lock 。(未驗證)
另外next-key-lock會鎖定目前值的前後兩個範圍,但是不包括臨界值。
#############################################
間隙鎖參考連結:
http://www.2cto.com/database/201410/343841.html
5.死鎖案例分析:
innodb next-key lock引發的死鎖:
http://www.cnblogs.com/xhan/p/3701459.html
唯一鍵造成的死鎖:
http://www.cnblogs.com/sunss/p/3166550.html
mysql中的delete死鎖
http://hedengcheng.com/?p=844