现象描述:
SQL响应时间超长,耗时几十秒才返回错误提示,后台日志中出现lock wait timeout exceeded; try restarting transaction的错误
问题场景:
1、在同一事务内先后对同一条数据进行插入和更新操作;
2、多台服务器操作同一数据库;
3、瞬时出现高并发现象;
问题原因:
1、在高并发的情况下,Spring事物造成数据库死锁,后续操作超时抛出异常。
2、Mysql数据库采用InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错
解决方法:
// 查询当前数据库的进程 SELECT * FROM information_schema.`PROCESSLIST` WHERE DB = '数据库名' // 查询数据库的事务 SELECT * FROM information_schema.INNODB_TRX // 查询当前出现的锁 SELECT * FROM information_schema.INNODB_LOCKS // 查询当前锁等待的关系 SELECT * FROM information_schema.INNODB_LOCK_WAITS
说明:看事务表INNODB_TRX,里面是否有正在锁定的事务线程,看看ID是否在show processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了,我们需要手动kill掉。
搜索的结果是在事务表发现了很多任务,这时候最好都kill掉。
完结!
【参考资料】
MySQL事务锁问题-Lock wait timeout exceeded:https://cloud.tencent.com/developer/article/1356959