接口響應時間超長,耗時幾十秒才返回錯誤提示,後臺日誌中出現Lock wait timeout exceeded; try restarting transaction
的錯誤mysql
一、在同一事務內前後對同一條數據進行插入和更新操做;
二、多臺服務器操做同一數據庫;
三、瞬時出現高並發現象;sql
一、在高併發的狀況下,Spring事物形成數據庫死鎖,後續操做超時拋出異常。
二、Mysql數據庫採用InnoDB模式,默認參數:innodb_lock_wait_timeout設置鎖等待的時間是50s,一旦數據庫鎖超過這個時間就會報錯數據庫
一、查看數據庫當前的進程,看一下有無正在執行的慢SQL記錄線程。segmentfault
mysql> show processlist;
二、查看當前的事務
當前運行的全部事務服務器
mysql> SELECT * FROM information_schema.INNODB_TRX;
當前出現的鎖併發
mysql> SELECT * FROM information_schema.INNODB_LOCKs;
鎖等待的對應關係高併發
mysql> SELECT * FROM information_schema.INNODB_LOCK_waits;
解釋:看事務表INNODB_TRX,裏面是否有正在鎖定的事務線程,看看ID是否在show processlist裏面的sleep線程中,若是是,就證實這個sleep的線程事務一直沒有commit或者rollback而是卡住了,咱們須要手動kill掉。學習
搜索的結果是在事務表發現了不少任務,這時候最好都kill掉。區塊鏈
三、批量刪除事務表中的事務
我這裏用的方法是:經過information_schema.processlist表中的鏈接信息生成須要處理掉的MySQL鏈接的語句臨時文件,而後執行臨時文件中生成的指令。spa
mysql> select concat('KILL ',id,';') from information_schema.processlist where user='cms_bokong'; +------------------------+ | concat('KILL ',id,';') | +------------------------+ | KILL 10508; | | KILL 10521; | | KILL 10297; | +------------------------+ 18 rows in set (0.00 sec)
固然結果不可能只有3個,這裏我只是舉例子。參考連接上是建議導出到一個文本,而後執行文本。而我是直接copy到記事本處理掉 ‘|’,粘貼到命令行執行了。均可以。
kill掉之後再執行SELECT * FROM information_schema.INNODB_TRX; 就是空了。
這時候系統就正常了
3.一、mysql都是autocommit配置
mysql> select @@autocommit; +--------------+ | @@autocommit | +--------------+ | 0 | +--------------+ 1 row in set (0.00 sec) # 若是是0 ,則改成1 mysql> set global autocommit=1;
3.二、mysql的引擎檢查,能夠檢查一下數據庫引擎是否是InnoDB(mysql5.5.5之前默認是MyISAM,mysql5.5.5之後默認是InnoDB)
show ENGINES; #檢查命令 若是不是的話改成 InnoDB :
show table status from db_name where name='table_name';
alter table table_name engine=innodb;