天天看點

間隙鎖相關問題:

間隙鎖相關問題:

#####################

測試資料:

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

繼續閱讀