MYSQL 的锁,一直都是一个研究的热点,其中GAP锁的研究一直很 HOT,如果有人问,在同一个查询段,GAP 锁是否可以“兼容”。你怎么回答,这里不做直接回答,我们来做实验
先交代清楚这个实验是怎么做的。
use test;
CREATE TABLE IF NOT EXISTS `gap_test`(
`id` INT UNSIGNED AUTO_INCREMENT,
`name` VARCHAR(20) ,
`age` tinyint ,
`date` DATETIME,
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 row_format = DYNAMIC;
insert into `gap_test` (name,age,date) values ('austin',18,now());
insert into `gap_test` (name,age,date) values ('tim',28,now());
insert into `gap_test` (name,age,date) values ('johnny',16,now());
insert into `gap_test` (name,age,date) values ('jason',17,now());
insert into `gap_test` (name,age,date) values ('winnset',38,now());
create index ix_gap_test_age on gap_test(age);
上面是初始的数据。
情景1 ,
Session 1
Session 2
下面我们看锁的信息
产生锁,但没有gap 锁
2 情况2
session 1
session 2
的信息
情况3
session 1
Session 2
结果
情况4
session 1
session 2
结果不锁
情况 5
session 1
session 2
结果
情况 6
session 1
session 2
结果
情况 7
session 1
session 2
结果
情况 8
session 1
session 2
结果
以上为测试结果,这里不浪费时间描述了,关键点在情况 7 ,看似不应该被锁,但实际上锁了,这里面设计 ICP 下推原则 和 GAP 锁的一些内容,找个时间 explaination。