ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction的問題解決(
https://blog.csdn.net/mayor125/article/details/76186661
今天讓運維將測試庫的資料到了匯出一份到自己電腦本地來做測試,資料量較大(幾百萬條吧),系統執行起來之後檢視訂單列表資料很慢(估計是自己電腦配置太low了,重新整理列表的時候一直在載入),然後就想刪除部分資料,在刪除的時候出現報錯:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction。(把這個問題記錄下來,防止以後再次遇到了方便處理)。
DELETE FROM t_loan_apply WHERE DATE(addtime) < '2017-06-01';
網上一通查詢,解決方式如下:
1、先檢視資料庫的事務隔離級別:
select @@tx_isoloation;
REPEATABLE-READ // MySQL預設的事務隔離級別就是REPEATABLE-READ
2、然後檢視當前資料庫的執行緒情況:
SHOW FULL PROCESSLIST;
沒有看到正在執行的很慢SQL記錄執行緒,再去檢視innodb的事務表INNODB_TRX,看下里面是否有正在鎖定的事務執行緒,看看ID是否在show full processlist裡面的sleep執行緒中,如果是,就證明這個sleep的執行緒事務一直沒有commit或者rollback而是卡住了,我們需要手動kill掉。
SELECT * FROM information_schema.INNODB_TRX;
3、發現有id為616694的sql,需要手動kill掉
KILL 616694;
kill之後,再去執行上面的delete語句,就可以執行成功了。
注意:MySQL是自動提交事務的(即:autocommit=1),可以使用 show variables like 'autocommit' 或者 select @@autocommit 檢視當前資料庫是否為自動提交事務;若autocommit的值不是1還可以使用set global autocommit = 1 將自動提交設定為開啟。