等待表後設資料鎖

Mehvish Ashiq 2024年2月15日
  1. MySQL 中的鎖是什麼
  2. MySQL 中的後設資料鎖等待是什麼
  3. 在 MySQL 中什麼時候出現 Waiting for table metadata lock
等待表後設資料鎖

今天,我們將學習等待表後設資料鎖定。本文重點介紹了後設資料鎖定等待的原因並提供瞭解決方案。

MySQL 中的鎖是什麼

是一種與表關聯的機制,用於限制對錶資料的未授權訪問。MySQL 還允許表鎖定以避免在特定時間段內對同一表進行未經授權的更新。

請參閱以下資訊圖,其中 使用者 A 更新記錄並設定 SALARY = SALARY + 500。同時,當 User A 更新記錄時,User B 訪問 Employee 表並檢索尚未更新的 SALARY

等待表後設資料鎖 - 什麼是鎖

為了避免這種情況,使用者會鎖定(READ 鎖或 WRITE 鎖)表,這會使其他使用者處於等待狀態。等待列表中的使用者會收到等待表後設資料鎖定的訊息。

MySQL 中的後設資料鎖等待是什麼

表上的後設資料鎖限制了對錶結構的任何更改。在這種鎖定機制中,在事務完成之前,任何其他會話都無法在資料定義語言語句中訪問會話中的事務訪問且仍在程序中的表。

當有活動事務時,請求資料寫入的會話將被置於後設資料鎖定等待狀態。

在 MySQL 中什麼時候出現 Waiting for table metadata lock

當我們 DELETECREATE 索引並修改表的結構時,可能會發生 Waiting for table metadata lock

當我們對錶執行維護操作、DELETE 表或嘗試訪問表級別的 WRITE 鎖(使用此查詢 LOCK TABLE table_name WRITE;)時,也會發生這種情況。

導致後設資料鎖等待的活動事務

不同型別的活動事務可能導致後設資料鎖定等待。下面列出了一些可能發生後設資料鎖定等待的情況。

  1. 查詢一個已經存在很長時間的表。
  2. 未能 COMMITROLLBACK 隱式或顯式開啟的事務。
  3. 當我們對一個表有一個不成功的查詢事務時。

如何識別和解決 Waiting for table metadata lock

我們可以使用以下命令以表格形式獲取必要的資訊,顯示等待表後設資料鎖定發生的位置。

命令:

mysql> show processlist;

輸出:

等待表後設資料鎖定 - 程序列表

我們可以使用下面的查詢,檢查 TRANSACTIONS 部分以進行進一步調查,並檢查哪個事務放置在 Waiting for table metadata lock 中。

命令:

SHOW ENGINE INNODB STATUS;

TRANSACTIONS 部分線上程 189 中存在問題,該執行緒處於空閒狀態並讓事務處於執行狀態;見下文。

等待表後設資料鎖 - 事務

後設資料鎖應該通過殺死這個執行緒來釋放,如下所示。

KILL 189;

請記住,無論何時發生後設資料鎖定等待,它都會阻止所有後續嘗試訪問該表的查詢(請求)。這種情況會導致連線擁塞並影響公司。

作者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook