MySQL 5.6 metadata lock 原始碼解讀
一、 MDL(Metadata Lock)
MDL,就是通常所說的表的Metadata Lock。5.5.3以及5.6版本,對這塊的定義越來越清晰。從5.6來講,MySQL對MDL分為兩個維度來管理:時間和粒度。
1. 時間(duration)維度
MySQL從對鎖持有的時間上來講,分為三種:statement,transaction和explicit。
· Statement:從語句開始執行時獲取,到語句執行結束時釋放。
· Transaction:在一個事務中,此事務所涉及到的所有表獲取MDL,一直到事務commit或者rollback(或:執行緒中終清理)才釋放。
· Explicit:需要MDL_context::release_lock()顯式釋放。語句或者事務結束,也仍然持有。如Lock table, flush .. with lock語句等。
2. 粒度(type)
MySQL對鎖的粒度的區分,又分為兩種:scope鎖(MDL_scoped_lock)和object鎖(MDL_object_lock)
Scope鎖:
分為4種型別,適用於global/schema/commit。
IS:意向範圍共享鎖,最低階鎖,與其它三種都相容。
IX:意向範圍排它鎖,與IX相容,與S,X不相容。
S: 範圍共享鎖,與S相容,與IX,X不相容。
X: 範圍排它鎖,與IX,S,X不相容。
優先順序上,X>S>IX。IS與其它三者都相容,通常我們不太關注。
object鎖:
分為9種型別,適用於具體物件如,table/function/procedure/view/event等。
· MDL_INTENTION_EXCLUSIVE:意向排它鎖。僅用於範圍鎖上,可升級到exclusive。持有者可申請單個對像的排它鎖。
· MDL_SHARED:能讀表metadata資訊,不可對錶資料讀寫。
· MDL_SHARED_HIGH_PRIO:與MDL_SHARED相比,在申請時,會忽略正在申請的排它鎖。主要用在information_schema資訊的填充。
· MDL_SHARED_READ:能讀表metadata資訊,也可讀表資料。如查詢和子查詢,Lock table … read等。
· MDL_SHARED_WRITE:涉及到DML操作以及select … update時申請。但DDL和Lock table … write時,不申請此鎖。
· MDL_SHARED_UPGRADABLE:通常在DDL第一階段獲取。可升級到MDL_SHARED_NO_WRITE和 MDL_EXCLUSIVE。
· MDL_SHARED_NO_WRITE:通常在DDL第一階段獲取。也是一個可升級鎖,可升級到MDL_EXCLUSIVE。此鎖阻止任何對錶的寫操作,但允許併發讀。通常被用於需要out of place DDL的第一個階段。
· MDL_SHARED_NO_READ_WRITE:也是一個可升級鎖,可升級到MDL_EXCLUSIVE。但是阻止對錶的讀寫操作。用於Lock table … write。
· MDL_EXCLUSIVE:最高階別MDL鎖,通常用於Drop/Create/Rename等操作。也用於其它物件建立或者刪除時,如create trigger等。
鎖的相容矩陣:
這9種型別,大致上是從低到高排序的。另外也是根據對錶的metadata資訊和表的資料訪問結合來確定的。
· MDL_key類:代表具體的後設資料項,由namespace(包含table,view,trigger等)+database name+table name組成。
· MDL_request類:代表MDL的請求,以連結串列結構儲存。其中還包含鎖的duration,鎖的型別(type)等。
· MDL_ticket類:代表已經獲取到的MDL鎖。
對於不同的DDL或者DML操作,不同的階段,所持有鎖的等級也不一樣,但是都可以歸到上面幾種型別中去。結合鎖的時間維度和粒度,可以產生非常多的有趣現象。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30088583/viewspace-1443073/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 5.6 drop database時,table metadata lock等待MySqlDatabase
- 【Mysql】metadata lock鎖MySql
- MYSQL 鎖:metadata lockMySql
- 【MySQL】MetaData Lock 之一MySql
- 【MySQL】MetaData Lock 之二MySql
- 【MySQL】MetaData Lock 之三MySql
- MySQL DDL Waiting for table metadata lock 解決MySqlAI
- mysql觀測METADATA LOCK(MDL)鎖MySql
- mysql metadata lock原理與實現MySql
- PostgreSQL 原始碼解讀(220)- Locks(LOCK Struct)SQL原始碼Struct
- MySQL 5.6 global read lock 介紹MySql
- MySQL新增索引偶遇waiting for table metadata lockMySql索引AI
- MySQL 5.6原始碼編譯安裝流程MySql原始碼編譯
- MySQL5.6 linux原始碼安裝MySqlLinux原始碼
- 5.6 以太坊原始碼詳解6原始碼
- PostgreSQL 原始碼解讀(222)- Locks(Lock Manager Internal Locking)SQL原始碼
- MySQL核心原始碼解讀-SQL解析一MySql原始碼
- Linux下MySQL5.6原始碼安裝LinuxMySql原始碼
- CentOS 6.5 原始碼編譯安裝 MySQL 5.5 5.6CentOS原始碼編譯MySql
- CentOS 6.7下MySQL 5.6原始碼編譯安裝CentOSMySql原始碼編譯
- 原始碼包編譯安裝MySQL 5.6指令碼原始碼編譯MySql指令碼
- Waiting for table metadata lockAI
- mysql metadata lock後設資料鎖之鎖狀態lock_status流轉圖MySql
- MYSQL METADATA LOCK(MDL LOCK)學習(1) 理論知識和加鎖型別測試MySql型別
- PostgreSQL 原始碼解讀(3)- 如何閱讀原始碼SQL原始碼
- Mysql5.6 for Centos6.5原始碼編譯安裝MySqlCentOS原始碼編譯
- WeakHashMap,原始碼解讀HashMap原始碼
- Handler原始碼解讀原始碼
- Laravel 原始碼解讀Laravel原始碼
- Swoft 原始碼解讀原始碼
- SDWebImage原始碼解讀Web原始碼
- MJExtension原始碼解讀原始碼
- Masonry原始碼解讀原始碼
- HashMap原始碼解讀HashMap原始碼
- Redux原始碼解讀Redux原始碼
- require() 原始碼解讀UI原始碼
- ZooKeeper原始碼解讀原始碼
- FairyGUI原始碼解讀AIGUI原始碼