在我們開發的過程中,使用全局鎖和表鎖的場景比較少,接觸的也相對少一點,下面主要介紹一下。
全局鎖
FTWRL
全局鎖就是對整個數據庫實例加鎖,MySQL 提供了 flush tables with read lock (FTWRL) 的方式去加全局鎖。當你需要讓整個庫處于只讀狀態的時候,就可以使用這個命令了,之后所有線程的更改操作都會被阻塞。
mysqldump
mysqldump 是官方提供的備份工具,可以通過 --single-transaction 參數來啟用可重復讀隔離級別,從而可以拿到一個一致性視圖。
set global readonly = true
通過上述命令可以讓全庫進入只讀狀態,但是在開發當中,事務框架往往會利用這個參數來處理讀寫分離。所以通常情況下,還是不建議使用這種方式。
表級鎖
MySQL 的表級鎖有 2 種:表鎖 和 元數據鎖。
表鎖
表鎖可以使用 lock tables T read/write , 可以使用 unlock tables 主動釋放鎖,也可以在客戶端斷開的時候自動釋放鎖。
MDL (metadata lock)
MDL 沒有顯示的命令,當執行改表語句時,MDL 會保證讀寫的正確性。MySQL 在 5.5 版本以后引入了 MDL 鎖,當對一個表做 增刪改查 的時候,加 MDL 讀鎖;當要多表結構做變更的時候,加 MDL 寫鎖。
- MDL 讀鎖之間不互斥,因此可以有多個線程同時對一張表 增刪改查。
- MDL 讀-寫、寫-寫之間是互斥的,因此如果同時有 2 個線程給表加字段,則需要順序執行。
當我們在線上更改表字段的時候,可能會造成長時間的服務不可用。流程如下: