Mysql 查询是否存在锁表有多种方式,这里只介绍一种最常用的
1、查看正在进行中的事务
SELECT * FROM information_schema.INNODB_TRX
2、查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
3、查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
4、查询是否锁表
SHOW OPEN TABLES where In_use > 0;
在发生死锁时,这几种方式都可以查询到和当前死锁相关的信息。
5、查看最近死锁的日志
show engine innodb status
解除死锁
如果需要解除死锁,有一种最简单粗暴的方式,那就是找到进程id之后,直接干掉。
查看当前正在进行中的进程
show processlist
// 也可以使用
SELECT * FROM information_schema.INNODB_TRX;
这两个命令找出来的进程id 是同一个 ,杀掉进程对应的进程 id kill id
验证(kill后再看是否还有锁)
SHOW OPEN TABLES where In_use > 0;
详解
MySQL死锁的排查是一个涉及多个步骤的过程,主要包括查看死锁信息、分析锁等待情况、优化事务和SQL语句等。以下是一些详细的排查步骤:
1.查看死锁信息
使用SHOW ENGINE INNODB STATUS命令
运行SHOW ENGINE INNODB STATUS;命令可以查看InnoDB存储引擎的状态信息,包括最近检测到的死锁信息。在输出结果中,找到LATEST DETECTED DEADLOCK部分,这里会列出最近发生的死锁信息,包括涉及的事务、它们持有的锁以及等待的锁等。
查看死锁日志
如果MySQL配置了死锁日志(通过innodb_print_all_deadlocks = 1在配置文件中启用),死锁日志会记录在MySQL的错误日志文件中。可以通过查看错误日志文件来获取死锁的详细信息。
2.分析锁等待情况
使用information_schema数据库中的表
INNODB_LOCKS:显示当前持有的锁。
INNODB_LOCK_WAITS:显示锁等待关系。
查询这些表可以获取当前锁的详细信息,包括哪些事务正在等待锁以及哪些锁被其他事务持有。
使用performance_schema数据库
MySQL的performance_schema提供了丰富的性能监控信息,包括锁的等待信息。可以查询performance_schema.data_locks和performance_schema.data_lock_waits表来获取锁的详细信息和等待关系。
3.分析SQL语句和事务
查看当前运行的事务
使用SELECT * FROM information_schema.INNODB_TRX;命令可以查看当前运行的所有事务及其状态,包括事务ID、事务状态、执行时间、执行的SQL语句等。
分析SQL语句的执行计划
使用EXPLAIN命令分析可能导致死锁的SQL语句的执行计划。通过分析执行计划,可以了解SQL语句是如何执行的,包括使用的索引、锁的类型等,从而发现可能导致死锁的问题。
4.优化事务和SQL语句
优化事务设计
减少事务的粒度:将大事务拆分为多个小事务,减少锁的持有时间。
优化事务的执行顺序:确保多个事务以相同的顺序请求相同的资源。
减少事务的并发度:通过调整事务的并发度,减少资源竞争。
优化SQL语句
使用合适的索引:通过使用合适的索引,减少锁的粒度。
减少锁的持有时间:通过优化SQL语句,减少锁的持有时间。
避免全表扫描:通过避免全表扫描,减少锁的竞争。