测试环境:mysql 5.7.18,,RR隔离级别
创建表,插入部分测试数据
创建表yhtest (
,一个INT (11) NOT NULL AUTO_INCREMENT
, INT
(11)默认为空,
, c INT(11)默认为空,
,主键(a),
,唯一键(b)
)引擎=INNODB;
插入yhtest值(1,1,
1),
(2 2 2),
(3, 3, 3),
(4、4、4),
(5 5 5),
(6 6 6),
(7
7),
(8 8 8),
(9, 9, 9),
(10、10、10),
(11、11、11);
操作:
事物1:开始,
事物2:开始,
事物1:删除从yhtest=2;,,可以执行
事物2:删除从yhtest=3;,,可以执行
事物1:删除从yhtest=4;,,可以执行
事物2:删除从yhtest=5;,,可以执行
事物1:插入yhtest值(2 2 2);,,锁等待,待事物2回滚后,可以执行
事物2:插入yhtest值(3,3,3);,,报出死锁,回滚,如下:
死锁日志:
- - - - - - - - - - - - - - - - - - - - - - - -
最新发现
僵局
- - - - - - - - - - - - - - - - - - - - - - - -
2017-10-27 19:38:00
0 x7f4b67932700
* * *(1)事务:
事务3914,活跃117秒
插入
使用mysql表1,锁定1
锁等待6锁结构(s),堆
大小1136 7行锁,undo日志条目3
MySQL线程id 4、OS线程
处理139961837504256,查询id 53 localhost根更新
插入yhtest
值(2,2,2)
* * *(1)等待这个锁被授予:
记录锁
空间id 31页没有4 n比特80指数b表“测试”。yhtest trx id 3914
等待锁定模式S
记录锁,堆物理记录:4号n_fields 2;
紧凑的格式;信息比特32
0: len 4;十六进制80000003;asc,,,
1:兰
4;十六进制80000003;asc,,;,
* * *(2)事务:
事务3919,活跃93秒插入
mysql
表在使用1,锁定1
6锁结构(s),堆大小1136,6行锁,
undo日志条目3
MySQL线程id 5, OS线程处理139961836971776,查询
id 54 localhost根更新
插入yhtest值(3,3,3)
* * * (2)
锁(S):
记录锁空间id 31页没有4 n比特80指数b表
“测试”。“yhtest”trx id 3919 lock_mode X锁rec
记录锁,但不是差距
4号堆物理记录:n_fields 2;紧凑的格式;信息比特32
0:兰
4;十六进制80000003;asc,,,
1: len 4;十六进制80000003;asc,,;,
* * *(2)等待这个锁被授予:
记录锁空间id 31页
没有4 n比特80指数b表“测试”。yhtest trx id 3919锁模式年代
等
记录锁,堆没有5物理记录:n_fields 2;紧凑的格式;
信息比特32
0: len 4;十六进制80000004;asc,,,
1: len 4;十六进制80000004;
asc,,,
* * *我们回滚事务(2)
通过innodb日志可以看的出,
事物1执行,插入yhtest值(2 2 2);时,会等待b列索引b=3上的年代锁被添加,b=3 这一行因为被事物2执行了删除从yhtest=3;,排他锁锁住,S锁等待正常。
事物2执行,插入yhtest值(3,3,3);时,可以看出其持有b=3的X锁,等待b=4上的年代锁被添加,b=4 这一行因为被事物1执行了删除从yhtest=4;排他锁锁住,S锁等待, 这时候,事物1和事物2互相等待对方持有的锁资源,形成回环,死锁出现
这里事物1 插入(2 2 2)和事物2插入(3,3,3)因为b列的唯一键存在,需要进行唯一键校验,而由于在之前已经进行了该列删除,需要通过锁定下一列判断b=2 的唯一性,b=3的唯一性,而这两列的锁已经被对方持有,故出现死锁。
这种死锁情况,在RC隔离级别下同样会出现!,