锁的调试分为俩部分,一是服务器级别的锁的调试。二是存储引擎级别的锁的调试
对于服务器级别的锁的调试:
服务器级别的锁的类型有表锁,全局锁,命名锁,字符锁
调试命令:
Show processlist 来查看当前的查询进程的状态,具体有哪些状态可能需要在实践中自己去查了。
还没有可以找到谁持有锁的方法,可以使用debug命令来打印关于锁的信息到服务器的错误日志中,可以使用mysqlladmin工具来运行这个命令: mysqlladmin debug 可以在日志中看到很多的调试信息
存储引擎中的锁调试:
调试命令;
1. Show innodb status 如果事务在等待锁,那么这个锁的一部分信息就回被输出,但不会输出所有的锁的信息。而且也很难找到是谁持有这个锁。可以通过打开innodb的锁监控,它最多可以监控每个事务中拥有的10把锁。激活这个监控的方法是 创建一个 innnodb_lock_monitor的表。然后MySQL会定时的打印增强版的 Show innodb status 到日志或标准输出中。删掉这个表来停止监控。由于输出的内容会很冗余,可以使用innotop来解析和格式化输出的内容也可以使用一些补丁来对输出的结果进行简化。
2.使用information_schema 系列的表来查看锁的持有状态。要求mysql版本在5.1及以上和innodb插件。具体的表包括以下这三种:
select * from information_schema.INNODB_TRX\G; //记录当前正在执行的事务,以及事务的一些状态
select * from information_schema.INNODB_LOCKS\G; //包含了InnoDB事务锁的具体情况,包括事务正在申请加的锁和事务加上的锁。
select * from information_schema.INNODB_LOCK_WAITS; //包含了blocked的事务的锁等待的状态
这个的一个使用示例有:https://www.cnblogs.com/zhaoxinshanwei/p/9409511.html