mysql, Lock wait timeout exceeded; try restarting 解決

wangchunbo發表於2021-07-20

mysql, Lock wait timeout exceeded; try restarting transaction解決方案

錯誤提示:

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

clipboard.png

圖中紅色語句 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;

clipboard.png

其他的記錄不需要關注,因為其他的記錄狀態為“RUNNING” 即正在執行的事務,並沒有鎖。

三、三張表欄位說明

innodb_trx

desc information_schema.innodb_trx;

clipboard.png

innodb_locks

desc information_schema.innodb_locks;

clipboard.png

innodb_lock_waits

desc information_schema.innodb_lock_waits

clipboard.png

四、終極方法

如果以上方法殺掉執行緒,但還是不能解決,則我們就可以查詢執行執行緒用時比較久的使用者,然後直接幹掉。

SELECT * from information_schema.`PROCESSLIST` WHERE Time > 1000 AND USER = 'wonguser' ORDER BY TIME desc; kill 740097562

這樣把所有耗時比較久的任務幹掉,就可以解決這個問題了。

淦就完了的解決方案

別看那麼多么蛾子.

show processlist;
找出執行緒ID

kill 執行緒號id

時間長的,全乾掉.

Lock wait timeout exceeded; try restarting transaction解決方案

全殺

結束,撒花

然後就執行成功了,爽的狠

感謝

blog.csdn.net/java__project/articl...

本作品採用《CC 協議》,轉載必須註明作者和本文連結
感謝關注 上海PHP自學中心-免費程式設計視訊教學|

相關文章