Innodb的Next-key lock 为什么是左开右闭区间?
参考文章 :Innodb锁机制:Next-Key Lock 浅谈 - jyzhou - 博客园
Next-Key Lock 为什么要设计成 左开右闭区间呢?设计为间隙锁不就行了?为什么要右闭?
请大佬解答。
补充:
CREATE TABLE `a` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20000) DEFAULT NULL,
`name_2` varchar(1842) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8
session1加锁:
BEGIN;
SELECT * FROM a WHERE id < 6 AND id > 3 FOR UPDATE
session1加锁 (3,6]。?
验证
session2:
BEGIN;
SELECT * FROM a WHERE id=3 FOR UPDATE; # 可以读取
SELECT * FROM a WHERE id=6 FOR UPDATE; # 阻塞
select 3可以读,
select 6阻塞
为什么select 6要阻塞?
如果是怕使用update 修改6 为5的话,那不怕update 修改3为5么?
另外
测试session2修改边界id。
BEGIN;
SELECT * FROM a WHERE id=3 FOR UPDATE; # 可以读
UPDATE a SET id=2 WHERE id=3 #边界id可以往小改
UPDATE a SET id=5 WHERE id=3 #不能往大改
SELECT * FROM a WHERE id=6 FOR UPDATE; # 6就不能改,因为6有行锁。
UPDATE a SET id=6 WHERE id=6 # 6就不能改,因为6有行锁。
为什么对于边界的处理不一样呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
next-key lock 是个逻辑名。。实际上是间隙锁加一个行锁,你那个右闭就是行锁
----------更新
第一个疑问,因为在RR级别下,加锁的基本单位就是next-key lock,(有些特定的条件下会退化成行锁或间隙锁,比如唯一索引的等值查询),所以6会被锁上,尽管从逻辑上看没有必要。
还有你另外的部分是不是有注释写错了,没看懂
关于间隙锁: 假如设计成都是间隙锁, 那么对于id = 1,3,6,10,15这些记录就不会锁定了, 是不是?这样当然不行.
后面的看不太懂.