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






