请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

我新建一个表 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回答

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

0 回复 有任何疑惑可以回复我~
  • 提问者 放牧娃子 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2019-10-06 11:11:20
  • YogurtJ #2
    老师您好,课上讲的是左开右闭区间?
    回复 有任何疑惑可以回复我~ 2020-03-05 22:22:59
  • 翔仔 回复 YogurtJ #3
    这里同学问的是"唯一索引部分命中,为什么是 左间隙 (30,50)加GAP锁呢,而不是左右间隙都加呢",我就这个问题回答:左闭右开: 是为了形象点儿呢。。 跟视频里讲的左开右闭不是一个东西吧,当时回答的时候的上下文有点想不起来了
    回复 有任何疑惑可以回复我~ 2020-03-06 01:39:36
qq_不弃_7 2019-11-23 20:29:34

#表数据内容

#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 回复 有任何疑惑可以回复我~
  • 翔仔 #1
    请问是什么隔离级别呢,并且表是myisam还是innodb的?
    回复 有任何疑惑可以回复我~ 2019-11-24 00:58:57
  • qq_不弃_7 回复 翔仔 #2
    RR级别的 innodb
    回复 有任何疑惑可以回复我~ 2019-11-24 08:25:44
  • CREATE TABLE `test1` (
      `id` varchar(20) NOT NULL COMMENT '编号',
      `name` varchar(20) NOT NULL COMMENT '姓名',
      PRIMARY KEY (`id`),
      UNIQUE KEY `name` (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    回复 有任何疑惑可以回复我~ 2019-11-24 08:28:22
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信