mysql Ver 14.14 Distrib 5.7.25, for Linux (x86_64) using EditLine wrapper
CREATE TABLE `ttt` (
`uid` varchar(18) NOT NULL DEFAULT '',
`gap` int NOT NULL ,
PRIMARY KEY (`uid`),
KEY `gap` (`gap`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ccc_11332234';
insert into `ttt` values ('11111',1);
insert into `ttt` values ('11113',3);
insert into `ttt` values ('11115',5);
insert into `ttt` values ('11117',7);
insert into `ttt` values ('11119',9);
start transaction;
select * from `ttt` where `gap`=3 for update;
===============
另外一个客户端执行:
sql1: insert into ttt
values ('22222',5);
sql2: insert into ttt
values ('22233322',1);
阅读 mysql 技术内幕,其中对于 innodb 锁算法的时候看到,对于 1,3,5,7,9 数据存在的辅助索引,next-key locking 应该(-无穷,1] (1,3] (3,5] (5,7]... 在执行上述 for update 时候,查询的时候辅助索引所以会加上 (1,3]的锁,而且会在下一个索引值加上 gap lock(3,5), 同时主键 11113 会加上 record lock.
但是上述实际执行时 sql 2 会被阻塞.就是说(1,3]左边也是闭区间,为什么?
同时想问为什么这种 next-key locking 能解决幻读问题.?
(提前感谢大家的回答)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.