怎么找到上锁的 SQL 语句

怎么找到上锁的 SQL 语句

发布时间:2022-04-26 浏览次数:4032

问题

有的时候 SQL 语句被锁住了,可是通过 show processlist 找不到加锁的的 SQL 语句,这个时候应该怎么排查呢

前提

image

实验

1、建一个表,插入三条数据

image

image

2、开启一个事务,删除掉一行记录,但不提交

image

3、另开启一个事务,更新这条语句,会被锁住

image

4、通过 show processlist 只能看到一条正在执行的 SQL 语句

image

5、接下来就是我们知道的,通过 information_schema 库里的 INNODB_TRX、INNODB_LOCKS 、INNODB_LOCK_WAITS 获得的一个锁信息

image

image

6、从上面可以看出来是 thread_id 为 22188 的执行的 SQL 语句锁住了后面的更新操作,但是我们从上文中 show processlist 中并未看到这条事务,测试环境我们可以直接 kill 掉对应的线程号,但如果是生产环境中,我们需要找到对应的 SQL 语句,根据相应的语句再考虑接下来应该怎么处理

7、需要结合 performance_schema.threads 找到对应的事务号

image

image

image

8、找到事务号,可以从 events_statements_current 找到对应的 SQL 语句:SQL_TEXT

image

image

image

image

image

9、可以看到是一条 delete 阻塞了后续的 update,生产环境中可以拿着这条 SQL 语句询问开发,是不是有 kill 的必要。


相关推荐

产品试用 产品试用
400-820-6580 免费电话