最近在使用Mysql查詢語句時,出現了Lock wait timeout exceeded; try restarting transaction錯誤,在進行查閱后再次做下記錄
Lock wait timeout exceeded; try restarting transaction錯誤的意思是這條語句被鎖住了,需要重新執行事務
解決方法:
通過
information_schema表
來進行查找被鎖的語句。information_schema
這張數據表保存了MySQL服務器所有數據庫的信息。如數據庫名,數據庫的表,表欄的數據類型與訪問權限等。再簡單點,這台MySQL服務器上,到底有哪些數據庫、各個數據庫有哪些表,每張表的字段類型是什么,各個數據庫要什么權限才能訪問,等等信息都保存在information_schema表里面。
以下三張表可以用來查看原因:
innodb_trx
當前運行的所有事務innodb_locks
當前出現的鎖innodb_lock_waits
鎖等待的對應關系
innodb_trx表的字段說明:
desc information_schema.innodb_trx;
通過以下語句來查看正在執行的事務:
select * from information_schema.innodb_trx
結果如下:
記錄trx_mysql_thread_id號,發現trx_state的狀態為RUNNING,說明事務正在進行,沒有鎖,但是可能由於sql復雜影響查詢效率,sql一直處於運行狀態
通過kill 28166 命令來殺掉mysql線程
殺掉線程后可以繼續查詢是否成功:
SELECT * from information_schema.processlist WHERE id = 28166;
發現成功殺死了線程
殺死成功后,就應該考慮率下SQL優化或者SQL的復雜程度了,盡量來減少執行時間!!!