李七天 2019-11-11 13:01 采纳率: 0%
浏览 463
已结题

关于mysql间隙锁的一些疑问

先上环境

图片说明

创建表:

CREATE TABLE `z` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `b` (`b`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

准备数据:

INSERT INTO `jj`.`z`(`id`, `b`) VALUES (1, 2);
INSERT INTO `jj`.`z`(`id`, `b`) VALUES (3, 4);
INSERT INTO `jj`.`z`(`id`, `b`) VALUES (5, 6);
INSERT INTO `jj`.`z`(`id`, `b`) VALUES (7, 8);
INSERT INTO `jj`.`z`(`id`, `b`) VALUES (9, 10);

先开启事务T1 对 b=6 加X锁

BEGIN;
SELECT *FROM z WHERE b = 6 FOR UPDATE;

再开启事务T2 插入 (2,8)

BEGIN;
INSERT INTO z VALUES (2, 8);

测试发现 事务T2 会blocked。

这是为什么呢 ?

下面是我自己对 事务T1 执行的 select for update语句的加锁分析

1 首先会 获取到'z'表的意向排它锁

2 对b=6的数据,二级索引加next-key锁,聚集索引加X锁

3 间隙锁,这也是我最有疑问的地方,我认为间隙的范围是(id =3,b=4)到 (id=7,b=8),也就是b索引锁的范围是 (4, 8], 我事务T2插入(2,8)也不应该 blocked啊~

求教求教 感谢感谢

  • 写回答

3条回答 默认 最新

  • dabocaiqq 2019-11-11 13:02
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog