MySQL 全域性表和表鎖

廖子博發表於2024-10-15

MySQL 的鎖可以分為全域性表、表級表和行鎖三類。

全域性鎖

加全域性讀鎖,整個資料庫處於只讀狀態,可以用於資料庫備份

flush tables with read lock

利用重複讀隔離級別,可以避免加全域性鎖

mysqldump --single-transaction

不推薦使用 set global readyonly=true 使整庫處於只讀狀態

  • readonly 可能用於主從角色判斷
  • 客戶端意外斷開連線後,全域性鎖會自動釋放;而 readonly 不會自動恢復

表級鎖

MySQL 有兩種表級鎖,分別是表鎖和後設資料鎖

表鎖

表鎖語法,客戶端連線斷開也會釋放鎖

lock tables t1 read/write lock
unlock tables

後設資料鎖

MySQL 5.5 引入後設資料鎖(meta data lock,MDL)。對於表做增刪改查加 MDL 讀鎖,對錶做表結構變更加 MDL 寫鎖,以保證表結構變更的安全性。

申請MDL鎖會形成佇列;
執行緒1執行 CRUD 獲取後設資料鎖,執行緒2執行表結構獲取後設資料鎖時會被阻塞,之後其他執行緒獲取後設資料讀鎖也會被阻塞(被執行緒2阻塞)

  • 透過 information_schema.innodb_trx 查詢是否有長事務,解決長事務
  • 對於熱點表,獲取後設資料寫鎖應該要有超時時間,避免阻塞後面的 CRUD 語句
  • MySQL 5.6 Online DDL

這裡使用佇列應該是類是公平鎖機制,使 CRUD 能夠 FIFO。

相關文章