錯誤提示:
Lock wait timeout exceeded; try restarting transaction
ps: 猴急的話,直接拉到最後,看結果.
官方分析
即Lock wait timeout exceeded; try restarting transaction
的異常,錯誤提示的意思,很明顯,是因為這條語句被鎖住了,所以釋放這個鎖。
土話分析
首先這個提示 是指,某個事務沒有提交.
那麼如果是測試服,不出意外,是某程式,在DEBUG 程式碼的時候, 打了斷點,但是沒有執行完,直接關了IDEA 或者關了 執行。
網路環境也不會,所以出現了這個問題。 導致mysql 感知不到 客戶端斷開了,事務沒有提交和回滾。出現了這個問題
這種問題不是死鎖哦
簡單說就是: idea debug模式下報錯,資料庫表事務沒有提交,idea服務強制關閉,導致資料庫表某一條記錄被鎖
官方分析與解釋
我們可以通過到information_schema
中來進行查詢被鎖的語句。
解釋:
information_schema
這張資料表儲存了MySQL伺服器所有資料庫的資訊。如資料庫名,資料庫的表,表欄的資料型別與訪問許可權等。再簡單點,這臺MySQL伺服器上,到底有哪些資料庫、各個資料庫有哪些表,每張表的欄位型別是什麼,各個資料庫要什麼許可權才能訪問,等等資訊都儲存在information_schema表裡面。
我們可以用下面三張表來查原因:
innodb_trx
當前執行的所有事務innodb_locks
當前出現的鎖innodb_lock_waits
鎖等待的對應關係
如果資料庫中有鎖的話,我們可以使用這條語句來檢視:
select * from information_schema.innodb_trx
圖中紅色語句 LOCK WAIT
為佔用系統資源的語句,我們需要殺掉這個鎖,執行 kill
執行緒id
號。上面這條記錄的id為199120823069, trx_mysql_thread_id
為 738178711, 所以我們執行:kill 738178711
殺掉這個MySQL語句的執行緒即可。
執行之後:
kill 738178711 // 查詢執行緒// SELECT * from information_schema.processlist WHERE id = 738178711;// show full processlist;
其他的記錄不需要關注,因為其他的記錄狀態為“RUNNING
” 即正在執行的事務,並沒有鎖。
三、三張表欄位說明
innodb_trx
desc information_schema.innodb_trx;
innodb_locks
desc information_schema.innodb_locks;
innodb_lock_waits
desc information_schema.innodb_lock_waits
四、終極方法
如果以上方法殺掉執行緒,但還是不能解決,則我們就可以查詢執行執行緒用時比較久的使用者,然後直接幹掉。
SELECT * from information_schema.`PROCESSLIST` WHERE Time > 1000 AND USER = 'wonguser' ORDER BY TIME desc; kill 740097562
這樣把所有耗時比較久的任務幹掉,就可以解決這個問題了。
淦就完了的解決方案
別看那麼多么蛾子.
show processlist;
找出執行緒ID
kill 執行緒號id
時間長的,全乾掉.
全殺
結束,撒花
然後就執行成功了,爽的狠
感謝
blog.csdn.net/java__project/articl...
本作品採用《CC 協議》,轉載必須註明作者和本文連結