深入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死锁的发生。


数据运维技术 » 深入MySQL死锁查看与处理(mysql死锁查看)