Innodb

當表被鎖定但 SHOW PROCESSLIST 不顯示任何內容時

  • November 4, 2020

我們的應用程序有些緩慢。當我檢查時,我發現一個特定的表被鎖定,所以所有事務都被拒絕了Lock wait timeout exceeded。當我這樣做時,SHOW PROCESSLIST;我希望看到一些帶有Waiting for table level lock狀態的程序,但它什麼也沒顯示!?只有在同一張表上的一些查詢 INSERT/UPDATE 在超時前恰好需要 120 秒,而其他程序則處於睡眠狀態(見圖):

在此處輸入圖像描述

在我的情況下,原因是一個事務正在對導致“ Lock wait timeout exceeded”的特定表進行讀鎖,因為它沒有送出。所以所有其他事務都在等待那個特定的 tranx 送出。

現在,為什麼SHOW PROCESSLIST;什麼都不顯示?事實上,確實如此。你會發現它(程序)處於“睡眠”狀態,並且在資訊列中沒有顯示任何查詢,就像它只是與數據庫的正常連接一樣。

讓我們在圖片中查看我的範例:在此處輸入圖像描述

在藍色中,這些是一些非常簡單的查詢被阻塞(在超時前需要 120 秒),紅色是“幽靈”或未送出的事務。

要查看此類事務的執行:

SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX

並且您可以終止為空的程序以釋放其他事務kill <id>;TRX_QUERY就我而言,KILL 33267342;

確保檢查未送出的事務以查看是否缺少一個commit;或一個Rollback子句,以避免此類問題。

引用自:https://dba.stackexchange.com/questions/279193