解決:Cause java.sql.SQLException Lock wait timeout exceeded; try restarting transaction; SQL []; Lock

解決: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掉)

  1. 到自己的數據庫中,打開information_schema中的INNODB_TRX表,查看他的內容,select * from information_schema.INNODB_TRX;
  2. 把查找到的數據中的trx_mysql_thread_id殺死就ok了。

開始上圖:

  1. 一開始我查是沒有事務,
    在這裏插入圖片描述

  2. 開啓一個事務,
    在這裏插入圖片描述

  3. 這個事務先在執行中,不提交和回滾,然後去查INNODB_TRX表,發現有記錄,而不是空的。
    在這裏插入圖片描述

  4. 執行一條和事務中update同樣的表發現會超時
    在這裏插入圖片描述

  5. 然後執行的update這個表的時候,查INNODB_TRX表會出現一個LOCK_WAIT狀態的記錄,看到trx_query中的sql就是我們剛剛執行的update,一直處於鎖等待狀態,然後就會超時,因爲有一個running狀態的爲提交的事務。

    1. 在這裏插入圖片描述

    2. 使用show processlist;命令可以查看trx_mysql_thread_id對應的線程列表中是不是有這個線程id。command爲sleep狀態。

  6. 開始解決問題,

    1. 在這裏插入圖片描述

    2. 在這裏插入圖片描述

    3. 這裏可以通過rollback;commit;方式回滾或提交當前事務,但是我們開發中,都是用Spring這樣的框架,所以我們用第二種方法kill掉這個線程就好了,kill [id];這裏的id是你剛放查詢INNODB_TRX表中的trx_mysql_thread_id。

我出現這樣的原因是因爲我在debug的時候,到一半的時候,直接強制把這個程序終止掉了,然後就出現了這個問題,所以開發中儘量不要這樣操作吧。