解決:Cause java.sql.SQLException Lock wait timeout exceeded; try restarting transaction; SQL []; Lock
時間 2021-01-06
標籤
JavaSE
Spring
spring
java
mysql
解決:Cause java.sql.SQLException Lock wait timeout exceeded; try restarting transaction; SQL []; Lock wait timeout exceeded; try restarting transaction; nested exception is java.sql.SQLException Lock wait timeout exceeded; try restarting transaction
前一段時間發現了這個問題,分享下解決思路
這個問題說的是你的表被鎖了,具體哪個表被鎖了你要看自己的情況,反正就是表被鎖了(數據庫有事務沒有提交,那個線程處於sleep裝態,我們需要把這個線程找出來,然後把它kill掉)
- 到自己的數據庫中,打開
information_schema
中的INNODB_TRX
表,查看他的內容,select * from information_schema.INNODB_TRX;
- 把查找到的數據中的
trx_mysql_thread_id
殺死就ok了。
開始上圖:
-
一開始我查是沒有事務,
-
開啓一個事務,
-
這個事務先在執行中,不提交和回滾,然後去查INNODB_TRX
表,發現有記錄,而不是空的。
-
執行一條和事務中update同樣的表發現會超時
-
然後執行的update這個表的時候,查INNODB_TRX
表會出現一個LOCK_WAIT狀態的記錄,看到trx_query中的sql就是我們剛剛執行的update,一直處於鎖等待狀態,然後就會超時,因爲有一個running狀態的爲提交的事務。
-
-
使用show processlist;
命令可以查看trx_mysql_thread_id對應的線程列表中是不是有這個線程id。command爲sleep狀態。
-
開始解決問題,
-
-
-
這裏可以通過rollback;commit;方式回滾或提交當前事務,但是我們開發中,都是用Spring這樣的框架,所以我們用第二種方法kill掉這個線程就好了,kill [id];這裏的id是你剛放查詢INNODB_TRX
表中的trx_mysql_thread_id。
我出現這樣的原因是因爲我在debug的時候,到一半的時候,直接強制把這個程序終止掉了,然後就出現了這個問題,所以開發中儘量不要這樣操作吧。