表结构
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获取这个锁,所以造成死锁
网友评论