插入死锁案例

死锁案例

1
2
3
4
5
6
7
CREATE TABLE `tt` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`tid` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_tid` (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
1
2
3
4
5
6
7
8
9
10
+----+------+-----+
| id | name | tid |
+----+------+-----+
| 1 | a | 1 |
| 2 | b | 2 |
| 4 | t | 4 |
| 5 | c | 5 |
| 6 | c | 16 |
| 7 | c | 17 |
+----+------+-----+

gap锁:
简单的理解就是执行 delete from tt where tid = 7,tid存在一个索引,mysql根据索引进行搜索,7不在这些key里面而是位于(5,16)间隙中,对(5,16)这个间隙加的锁就叫做Gap锁。
Insert Intention锁:
插入意向锁,insert语句会对插入的行加一个X锁,但是在插入这个行的过程之前,会设置一个Insert intention锁。

存在Insert Intention 锁时,申请Gap锁是允许的;但是存在Gap锁时,申请Insert Intention锁时是被阻止的。

T1:delete from tt where tid = 7;
T2:delete from tt where tid = 8;
T1:insert into tt values(null,’a’,8);
T2:insert into tt values(null,’b’,7);

T1 持有了Gap(5,16)的X锁;
T2 申请Gap(5,16)的X锁,该申请被授权,所以T2 持有了Gap(5,16)的X锁。
T1 申请Insert Intention(5,16)的X锁,根据之前讲的互斥关系,由于T2持有Gap(5,16)的X锁,该申请被block。
T2 申请Insert Intention(5,16)的X锁,根据之前讲的互斥关系,由于T1持有Gap(5,16)的X锁,该申请被block。

死锁很明显的出现了,T1与T2都持有一个锁,同时都在等对方释放一个锁。

参考

您的支持将鼓励我继续创作 笔芯