利用gdb跟蹤MDL加鎖過程

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 存儲過程鎖
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章