{{ it.name }}
{{ it.text }}
{{ innerIt.name }}
{{ innerIt.text }}
问题
有的时候 SQL 语句被锁住了,可是通过 show processlist 找不到加锁的的 SQL 语句,这个时候应该怎么排查呢
前提
实验
1、建一个表,插入三条数据
2、开启一个事务,删除掉一行记录,但不提交
3、另开启一个事务,更新这条语句,会被锁住
4、通过 show processlist 只能看到一条正在执行的 SQL 语句
5、接下来就是我们知道的,通过 information_schema 库里的 INNODB_TRX、INNODB_LOCKS 、INNODB_LOCK_WAITS 获得的一个锁信息
6、从上面可以看出来是 thread_id 为 22188 的执行的 SQL 语句锁住了后面的更新操作,但是我们从上文中 show processlist 中并未看到这条事务,测试环境我们可以直接 kill 掉对应的线程号,但如果是生产环境中,我们需要找到对应的 SQL 语句,根据相应的语句再考虑接下来应该怎么处理
7、需要结合 performance_schema.threads 找到对应的事务号
8、找到事务号,可以从 events_statements_current 找到对应的 SQL 语句:SQL_TEXT
9、可以看到是一条 delete 阻塞了后续的 update,生产环境中可以拿着这条 SQL 语句询问开发,是不是有 kill 的必要。