MySQL事務鎖問題----lock wait timeout exceeded; try restarting transaction

現象描述:

  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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章