深入MySQL死锁查看与处理(mysql死锁查看)
MySQL死锁是影响MySQL性能的一个常见问题,发生死锁时用户查询会受到影响,有时也会阻塞服务器。因此,了解MySQL死锁的根源,并能正确查看死锁和正确处理死锁对提高数据库运行、维护和排除故障来说都是非常重要的。
—深入MySQL死锁查看与处理
一、了解MySQL死锁
MySQL死锁是一种内部系统故障,是由于两个或两个以上处于等待状态(被锁定)的事务彼此死锁,死锁就是同时请求具有排他性的资源,而均不能满足,也就是一种非常可怕的死等现象。典型的,MySQL死锁发生在多线程程序中,一个线程获得了一个锁,但是等待另一个被另外一个线程拥有的锁,而而另外一个线程正在等待前一个线程释放掉已经获取的锁,从而形成一种相互等待,从而造成MySQL服务器无限期的挂起,从而形成死锁。
二、MySQL死锁的查看
想要查看MySQL死锁,需要使用MySQL的show engine innodb status语句,会在MySQL实例上显示有关数据库服务器活动的信息,比如实时执行的查询、运行的表扫描以及启用的索引,以及死锁的信息。例如:
mysql> show engine innodb status\G
*************************** 1. row ***************************
Type: InnoDB
Name:
Status:
…
—LATEST DETECTED DEADLOCK
————————
2020-07-18 13:32:20 0x7f4540013d80
*** (1) TRANSACTION:
TRANSACTION 879400609, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
…
此外,MySQL同时还提供了一些可以显示关于事务的死锁的信息的内部函数。例如SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; 查询INFORMATION_SCHEMA.INNODB_TRX视国贝,会查询出死锁发生的事务ID。
三、MySQL死锁的处理
死锁如果发生持续时间较长可以导致严重的性能问题,以及因为数据不一致导致数据库损坏等数据安全问题,因此,找到并正确处理和解决MySQL死锁是非常重要的。MySQL服务器会在发生死锁时报出错误消息,用户只要根据错误消息找到被死锁的事务,然后用KILL语句,终止被死锁的事务即可解决死锁的问题,如:
KILL 879400609; //Kill Transaction
正确处理MySQL死锁另外要根据错误消息里面的信息,调整应用层的程序,以确保死锁的发生概率较低,例如:
1. 尽量保持事务的简短性,以避免资源锁定时间过长。
2. 将复杂的表行列更新转化为简单的更新;
3. 避免在事务中调用有问题的存储过程;
4. 尽量使用低并发度的存储过程,减少死锁的发生等。
总之,MySQL死锁是数据库正常工作中常见的一个问题,查看和正确处理死锁对正常数据库运行,维护和排除故障是至关重要的,最好建立一些有关数据库正常工作的规则和流程来应对MySQL死锁的发生。