等待表後設資料鎖
今天,我們將學習等待表後設資料鎖定
。本文重點介紹了後設資料鎖定等待的原因並提供瞭解決方案。
MySQL 中的鎖是什麼
鎖是一種與表關聯的機制,用於限制對錶資料的未授權訪問。MySQL 還允許表鎖定以避免在特定時間段內對同一表進行未經授權的更新。
請參閱以下資訊圖,其中 使用者 A
更新記錄並設定 SALARY = SALARY + 500
。同時,當 User A
更新記錄時,User B
訪問 Employee
表並檢索尚未更新的 SALARY
。
為了避免這種情況,使用者會鎖定(READ
鎖或 WRITE
鎖)表,這會使其他使用者處於等待狀態。等待列表中的使用者會收到等待表後設資料鎖定
的訊息。
MySQL 中的後設資料鎖等待是什麼
表上的後設資料鎖限制了對錶結構的任何更改。在這種鎖定機制中,在事務完成之前,任何其他會話都無法在資料定義語言語句中訪問會話中的事務訪問且仍在程序中的表。
當有活動事務時,請求資料寫入的會話將被置於後設資料鎖定等待狀態。
在 MySQL 中什麼時候出現 Waiting for table metadata lock
當我們 DELETE
或 CREATE
索引並修改表的結構時,可能會發生 Waiting for table metadata lock
。
當我們對錶執行維護操作、DELETE
表或嘗試訪問表級別的 WRITE
鎖(使用此查詢 LOCK TABLE table_name WRITE;
)時,也會發生這種情況。
導致後設資料鎖等待的活動事務
不同型別的活動事務可能導致後設資料鎖定等待。下面列出了一些可能發生後設資料鎖定等待的情況。
- 查詢一個已經存在很長時間的表。
- 未能
COMMIT
或ROLLBACK
隱式或顯式開啟的事務。 - 當我們對一個表有一個不成功的查詢事務時。
如何識別和解決 Waiting for table metadata lock
我們可以使用以下命令以表格形式獲取必要的資訊,顯示等待表後設資料鎖定
發生的位置。
命令:
mysql> show processlist;
輸出:
我們可以使用下面的查詢,檢查 TRANSACTIONS
部分以進行進一步調查,並檢查哪個事務放置在 Waiting for table metadata lock
中。
命令:
SHOW ENGINE INNODB STATUS;
TRANSACTIONS
部分線上程 189 中存在問題,該執行緒處於空閒狀態並讓事務處於執行狀態;見下文。
後設資料鎖應該通過殺死這個執行緒來釋放,如下所示。
KILL 189;
請記住,無論何時發生後設資料鎖定等待,它都會阻止所有後續嘗試訪問該表的查詢(請求)。這種情況會導致連線擁塞並影響公司。