現象描述:
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