數據庫執行更新失敗,查看日志
首先是根據報的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異常開始的。
接下來就是分析慢日志,確定是業務代碼原因還是慢日志配置的原因(執行時間設定等),分析完之后刪掉騰出空間。