1、起因:
测试妹纸找过来说定时任务日志里有超时日志,我看了下估摸是依赖的服务A在重启之类的原因,问题不大观望下过一分钟应该没有了
过几分钟在看日志,居然还在不停的报错,于是就去依赖的服务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区分人为操作、服务器)对记录加了锁辣