关于next-key锁,gap锁区间的疑问

发布于 2022-09-06 15:51:02 字数 1913 浏览 20 评论 0

表user结构如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  `score` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `index_score` (`score`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

当前的user表数据如下:

idnamescore
1test15
2test210
3test315
4test422

我测试gap锁区间的sql如下:

事务隔离级别为RR
session 1session 2
begin;begin;
update user set name = 'test' where score = 15;-
-insert into user values(5, 'test5', 10); # 阻塞
-insert into user values(5, 'test5', 21); # 阻塞
commit;-
-commit;
Suppose that an index contains the values 10, 11, 13, and 20. The possible next-key locks for this index cover the following intervals, where a round bracket denotes exclusion of the interval endpoint and a square bracket denotes inclusion of the endpoint:

(negative infinity, 10]
(10, 11]
(11, 13]
(13, 20]
(20, positive infinity)

14.6.4.2 InnoDB Record, Gap, and Next-Key Locks

按照上面的说明,gap锁的区间应该是(10, 15],(15, 22],也就是(10, 22],但是我实际测试发现gap锁区间为[10, 22)?

环境说明:

System: ubuntu 16.04
Mysql Version: 5.5.56

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

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

发布评论

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

评论(3

ˇ宁静的妩媚 2022-09-13 15:51:02

最近也在看这一块,虽然知道晚了,万一以后有小伙伴有需要呢。。。
image.png

轻许诺言 2022-09-13 15:51:02

=.=.

事物分开,你是21的时候阻塞了。应该是锁(10,22)

begin;
-- 插入score value为10~21的时候会阻塞
insert into user values(5, 'test5', 10);

从来不烧饼 2022-09-13 15:51:02

对于精准匹配来说,它的扫描区间是[15,15],它会对15进行加next-key,也就是(10,15],然后会对下一条记录22加gap锁(15,22)。

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