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。