Innodb
當表被鎖定但 SHOW PROCESSLIST 不顯示任何內容時
我們的應用程序有些緩慢。當我檢查時,我發現一個特定的表被鎖定,所以所有事務都被拒絕了
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
子句,以避免此類問題。