MDL(Meta Data LocK)的作用
在MySQL5.1及之前的版本中,如果有未提交的事務trx,當執行DROP/RENAME/ALTER TABLE RENAME操作時,不會被其他事務阻塞住。這會導致如下問題(MySQL bug#989)
master: 未提交的事務,但SQL已經完成(binlog也準備好了),表schema發生更改,在commit的時候不會被察覺到.
slave: 在binlog裏是以事務提交順序記錄的,DDL隱式提交,因此在備庫先執行DDL,後執行事務trx,由於trx作用的表已經發生了改變,因此trx會執行失敗。 在DDL時的主庫DML壓力越大,這個問題觸發的可能性就越高
在5.5引入了MDL(meta data lock)鎖來解決在這個問題
MDL鎖的類型
metadata lock也是一種鎖。每個metadata lock都會定義鎖住的對象,鎖的持有時間和鎖的類型
屬性 | 範圍 | 作用 |
---|---|---|
GLOBAL | 全局鎖 | 主要作用是防止DDL和寫操作的過程中執行 set golbal_read_only =on 或flush tables with read lock; |
commit | 提交保護鎖 | 主要作用是執行flush tables with read lock後,防止已經開始在執行的寫事務提交 |
SCHEMA | 庫鎖 | 對象 |
TABLE | 表鎖 | 對象 |
FUNCTION | 函數鎖 | 對象 |
PROCEDURE | 存儲過程鎖 |