0

参考文章 :Innodb锁机制:Next-Key Lock 浅谈 - jyzhou - 博客园

Next-Key Lock 为什么要设计成 左开右闭区间呢?设计为间隙锁不就行了?为什么要右闭?

请大佬解答。

补充:

clipboard.png

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有行锁。

为什么对于边界的处理不一样呢?

arnold 75
2019-01-09 提问
2 个回答
0

next-key lock 是个逻辑名。。实际上是间隙锁加一个行锁,你那个右闭就是行锁
----------更新
第一个疑问,因为在RR级别下,加锁的基本单位就是next-key lock,(有些特定的条件下会退化成行锁或间隙锁,比如唯一索引的等值查询),所以6会被锁上,尽管从逻辑上看没有必要。
还有你另外的部分是不是有注释写错了,没看懂

0

关于间隙锁: 假如设计成都是间隙锁, 那么对于id = 1,3,6,10,15这些记录就不会锁定了, 是不是?这样当然不行.
后面的看不太懂.

撰写答案

推广链接