参考文章 :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有行锁。
为什么对于边界的处理不一样呢?
next-key lock 是个逻辑名。。实际上是间隙锁加一个行锁,你那个右闭就是行锁
----------更新
第一个疑问,因为在RR级别下,加锁的基本单位就是next-key lock,(有些特定的条件下会退化成行锁或间隙锁,比如唯一索引的等值查询),所以6会被锁上,尽管从逻辑上看没有必要。
还有你另外的部分是不是有注释写错了,没看懂