一次数据库锁等待超时疑似死锁排查过程

1、起因:

测试妹纸找过来说定时任务日志里有超时日志,我看了下估摸是依赖的服务A在重启之类的原因,问题不大观望下过一分钟应该没有了

一次数据库锁等待超时疑似死锁排查过程_第1张图片

过几分钟在看日志,居然还在不停的报错,于是就去依赖的服务A看了下日志

哎呀,居然锁等待超时,莫不是死锁了?

2、排查原因:

在mysql控制端执行命令看有没有开启死锁日志开关,ON开了

show variables like 'innodb_print_all_deadlocks';

继续执行命令show engine innodb status \G;,找到LATEST DETECTED DEADLOCK对应死锁明细,看是哪些sql导致了死锁

查看后居然没有找到死锁信息,那锁等待超时原因是什么?而且再观察日志都正常了没有锁等待超时,为什么突然就好了?中途没有任何重启动作

3、猜测:

没有死锁发生但由锁等待超时,程序是没可能的,都设置了超时时间不会十几分钟不释放的。那有没可能是人为对行记录加锁了呢?试探问了下组内的同事们,还真有位同事做过表记录更新操作,且更新的记录就是发生锁等待超时的记录。

那锁等待超时问题就告一段落了。

4、后续补充

有没办法明确的定位到行加锁问题而不是考猜测论证呢?有的

# 查看当前行锁明细

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

# 根据行锁明细中的trx_mysql_thread_id查询进程明细,host为客户端ip段进口

SELECT * FROM information_schema.processlist where id=2064080

这样就知道谁(host区分人为操作、服务器)对记录加了锁辣

你可能感兴趣的:(java,mysql)