数据库执行更新失败,查看日志
首先是根据报的Exception进行排查:
org.hibernate.exception.LockAcquisitionException: could not execute statement
很明显,是数据库死锁,导致不能执行我的更新sql。
思路一:查找并杀死死锁的进程
查看进程
-- 查询是否锁表 show OPEN TABLES where In_use > 0; -- 查询当前用户进程 SHOW PROCESSLIST; -- 查询当前的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; -- 查看当前锁定的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; -- 查看当前等锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
查找出占用当前锁的进程id,kill掉即可。
kill 1234;
通过上面方式未查询到死锁的进程,为排除其他进程影响,我将连接该数据库的进程都kill掉,之后重启服务进行重新连接,问题依然存在。
思路二:断开的管道
数据库死锁产生的原因有:
- 系统资源不足
- 进程运行推进的顺序不合适
- 资源分配不当等
通过上面排查基本排除掉是业务代码产生死锁,接下来排查系统资源,通过排查,发现果然是系统资源的原因导致。慢日志占用空间过大,导致数据库所在服务器不能再进行写入,所以报IOException。排查问题时也应该先从IO异常开始的。
接下来就是分析慢日志,确定是业务代码原因还是慢日志配置的原因(执行时间设定等),分析完之后删掉腾出空间。