MySQL 5.6 metadata lock 原始碼解讀

jesselyu發表於2015-02-27

一、 MDLMetadata 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章