Innodb的Next-key lock 为什么是左开右闭区间?

发布于 2022-09-11 17:02:01 字数 1332 浏览 20 评论 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有行锁。

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夢归不見 2022-09-18 17:02:01

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

一张白纸 2022-09-18 17:02:01

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文