唯一索引的部分命中区间问题

来源:3-17 锁模块之RR如何避免幻读

放牧娃子

2019-10-05

我新建一个表 test (id primary key, num unique key)
插入数据
1 10
3 30
5 50
7 70
9 90

事务A
START TRANSACTION;
DELETE FROM TEST WHERE NUM IN (50,45);

事务B
START TRANSACTION;

插入样例
ID = 2,NUM = 20 成功
ID = 2,NUM = 29 成功
ID = 4,NUM = 40 阻塞
ID = 6,NUM = 60 成功
ID = 8,NUM = 80 成功

问题1: 唯一索引部分命中,为什么是 左间隙 (30,50)加GAP锁呢,而不是左右间隙都加呢?

写回答

2回答

翔仔

2019-10-06

同学好,这个具体需要看底层源码的实现了,至于为什么会这样设计,我觉得应该是设计者遵循开发语言的左闭右开原则吧

0
5
翔仔
回复
YogurtJ
同学好,应该是符合这个场景的
2020-03-06
共5条回复

qq_不弃_7

2019-11-23

#表数据内容

#id(primary key) name(unique key)

1 10

3 30

5 50

7 70

9 90


事务A

START TRANSACTION;


delete from test1 where name in('50','60');


rollback;

事务B

START TRANSACTION;

INSERT INTO test1 VALUES('2','20');

INSERT INTO test1 VALUES('4','40');

INSERT INTO test1 VALUES('6','60');

INSERT INTO test1 VALUES('8','80');

#以上全部阻塞

ROLLBACK

为什么把整张表给锁了  以上内容全部插入不进

0
8
翔仔
回复
qq_不弃_7
厉害了我的同学:)
2019-12-18
共8条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程