一个死锁场景

表结构

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `c` int(11) DEFAULT NULL,
  `d` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `c` (`c`)
) ENGINE=InnoDB;

表数据

insert into t values(0,0,0),(5,5,5),
(10,10,10),(15,15,15),(20,20,20),(25,25,25);

事务隔离级别

image.png

事务操作过程

image.png

死锁分析

  • session A 加了 next-key lock(5,10] 和间隙锁 (10,15);
  • session B 请求 next-key lock(5,10] ,进入锁等待;
  • session A 要再插入 (8,8,8) 这一行,出现死锁

疑问点

  • session B获取Next Key锁阻塞,此时有没有拿到5,10的间隙锁
  • 死锁的原因是因为获取锁要排队?session A请求的插入意向锁,和session B中等待获取的Next Key锁冲突,所以需要等待session B获取后释放,才能轮到session A获取这个锁,所以造成死锁

你可能感兴趣的:(一个死锁场景)