对于 Gap 锁的一些疑问

79 天前
 main1234
事务隔离级别为 RR 可重复读
表结构和数据如下

mysql> show create table test;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`id` int(11) NOT NULL,
`num` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `num` (`num`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> insert into test values (10, 10), (20, 20), (30, 30), (40, 40), (50, 50)
mysql> select * from test;
+----+-----+
| id | num |
+----+-----+
| 10 | 10 |
| 20 | 20 |
| 30 | 30 |
| 40 | 40 |
| 50 | 50 |
+----+-----+
5 rows in set (0.05 sec)


事务 A 的 sql 如下

mysql> begin;
Query OK, 0 rows affected (0.01 sec)

mysql> select num from test where num > 10 and num < 15 for update;

事务 B 的 sql 如下
mysql> begin;
Query OK, 0 rows affected (0.03 sec)

mysql> insert into test values(120, 31);


此时事务 B 会阻塞,我理解事务 A 会添加 GAP 锁,我理解 GAP 的范围是[10,20],为什么事务 B 会阻塞??
1164 次点击
所在节点    MySQL
9 条回复
main1234
79 天前
show engine innodb status 看到的事务为插入意向锁阻塞
lock_mode X insert intention waiting
wangxin3
79 天前
我测了下 mysql 8.0.29 没有你说的问题,间隙锁范围是[10,20]
wangxin3
79 天前
@wangxin3 更正下间隙锁的范围是[10,20)
main1234
79 天前
@wangxin3 我也发现了,我用 5.6.23 会出现这样的问题,即使 sql 为 insert into test values(999, 999);也会阻塞
main1234
79 天前
5.6.23 会出现,8 不会有这样的问题,是那块做了修改么
charmsongo
78 天前
版本过低了?
main1234
78 天前
@charmsongo 应该是
Pythoner666666
78 天前
5.7 不会
wangxin3
78 天前
间隙锁的范围随着版本变化一直在改,不必纠结了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1016578

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX