mysql死锁记录

  

测试环境:mysql 5.7.18,,RR隔离级别

 mysql死锁记录


创建表,插入部分测试数据

创建表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);,,报出死锁,回滚,如下:

 mysql死锁记录


死锁日志:

- - - - - - - - - - - - - - - - - - - - - - - -
最新发现   僵局
- - - - - - - - - - - - - - - - - - - - - - - -
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隔离级别下同样会出现!,


mysql死锁记录