解决MySQL死锁的方法

  

下面一起来了解下解决MySQL死锁的方法,相信大家看完肯定会受益匪浅,文字在精不在多,希望解决MySQL死锁的方法这篇短内容是你想要的只

一、查看MySQL死锁

 MySQL数据库会自己解决死锁,扼杀掉一个会话的事务,让另外一个会话的事务可以执行
  
  完成显示引擎INNODB状态\ G
  
  ,,最新检测到死锁
<人力资源/>

0 2018-02-12 15:42:06 x7f6bd43df700
(1)事务:
事务3368,活跃16717秒开始索引读
mysql表中使用1,锁定1
锁等待7锁结构(s),堆大小1136,6行锁,undo日志条目2
mysql线程id 35, OS线程处理140101230081792,查询id 297 localhost根更新
删除,员工,其中列出=10001
(1)等待这个锁被授予:
记录锁空间id 26页没有表的4 n位408指数主要员工。员工trx id 3368 lock_mode X锁rec但不是差距等
记录锁,2号堆物理记录:n_fields 8;紧凑的格式;信息比特0
0: len 4;十六进制80002711;asc,& # 39;,
1: len 6;十六进制000000000 b20;asc,,,,
2: len 7;十六进制be0000013a0110;asc,,:;;;
3: len 3;十六进制8 f4322;asc, C";;
4: len 6;十六进制47656 f726769;asc格奥尔基;;
5: len 7;十六进制466163656 c6c6f;asc Facello;;
6: len 1;十六进制01;asc,;,
7: len 3;十六进制8 f84da;asc,,;;

(2)事务:
事务3374,活跃79秒开始索引读
mysql表中使用1,锁定1
4锁结构(s), 1136年堆大小,2行锁(s)
mysql线程id 36, OS线程处理140101099058944,查询id 298 localhost根更新
删除,员工,其中列出=10001
(2)持有的锁(s):
记录锁空间id 26页没有表的4 n位408指数主要员工。员工trx id 3374锁定模式S锁rec但不是差距
记录锁,2号堆物理记录:n_fields 8;紧凑的格式;信息比特0
0: len 4;十六进制80002711;asc,& # 39;,
1: len 6;十六进制000000000 b20;asc,,,,
2: len 7;十六进制be0000013a0110;asc,,:;;;
3: len 3;十六进制8 f4322;asc, C";;
4: len 6;十六进制47656 f726769;asc格奥尔基;;
5: len 7;十六进制466163656 c6c6f;asc Facello;;
6: len 1;十六进制01;asc,;,
7: len 3;十六进制8 f84da;asc,,,,

* * *(2)等待这个锁被授予:
记录锁空间id 26页没有4 n位408指数主要表的雇员。员工trx id 3374 lock_mode X锁rec但不是差距等
记录锁,2号堆物理记录:n_fields 8;紧凑的格式;信息比特0
0: len 4;十六进制80002711;asc,& # 39;,
1: len 6;十六进制000000000 b20;asc,,,,
2: len 7;十六进制be0000013a0110;asc,,:;;;
3: len 3;十六进制8 f4322;asc, C";;
4: len 6;十六进制47656 f726769;asc格奥尔基;;
5: len 7;十六进制466163656 c6c6f;asc Facello;;
6: len 1;十六进制01;asc,;,
7: len 3;十六进制8 f84da;asc,,,,

* * *我们回滚事务(2)

注意:死锁不记录在错误日志中,只能通过显示引擎INNODB状态\ G查看,而且显示引擎INNODB状态\ G只会记录上一次的死锁,如果要看上上次的则看不到

死锁模拟

session1:
mysql>开始,
查询好,0行影响(0.00秒)

mysql>从员工选择*,列出=10001锁在共享模式;
+ - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - +
|列出| birth_date | first_name | last_name性别| | hire_date, |
+ - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - +
|, 10001 | 1953-09-02 |格奥尔基,,| Facello,|米,,,| 1986-06-26 |
+ - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - +
1行组(0.00秒)中

session2:

mysql>删除,员工,列出=10001;,——卡住

session1:

mysql>删除,员工,列出=10001;
错误1213(40001):死锁发现当试图让锁;尝试重新启动事务中

session2:

上面卡住的语句已经被执行

查询好了,1行影响(5.76秒)

死锁分析:
session1持有锁,session2执行删除操作请求x,但年代,x互斥,session2进入请求队列等待(等待session1释放锁),session1又在请求x锁,这个时候队列中中session2在排的队,还轮不上session1, session1就等待,这种循环等待出现,死锁就出现了。

看完解决MySQL死锁的方法这篇文章后,很多读者朋友肯定会想要了解更多的相关内容,如需获取更多的行业信息,可以关注我们的行业资讯栏目。

  

解决MySQL死锁的方法