您的位置:首页 > 其它

间隙锁相关问题:

2015-08-11 16:58 239 查看
间隙锁相关问题:

#####################
测试数据:
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引发的死锁:
/article/6251071.html
唯一键造成的死锁:
/article/6393867.html
mysql中的delete死锁
http://hedengcheng.com/?p=844

本文出自 “SQLServer MySQL” 博客,请务必保留此出处http://dwchaoyue.blog.51cto.com/2826417/1683720
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: