Enqueue block

什麼是enqueue

enqueue可以做名詞,也可以做動詞來解釋。做名詞時,指的的是一種鎖的類型,比如Tx enqueue。做動詞時,則是指將鎖請求放入到請求隊列的操作。

 

我們知道,lock是一種需要排隊的鎖實現機制,這和latch是不一樣的,latch是一種輕量級的鎖,是不需要排隊得。Enqueue 就是lock的排隊機制的實現。

 

lock是用來實現對於共享資源的併發訪問的。如果兩個session請求的lock是兼容的,則可以同時鎖定資源,如果兩個session 請求的lock是不兼容的,則其中一個session必須等待另外一個 session釋放其持有的lock後,才能獲得對共享資源的鎖定。這時,等待的session的lock請求就需要進入到一個隊列當中,這就是enqueue等待。

 

Enqueue的模式

 enqueue(lock)一共有六種模式:

1 NULL

2 SS

3 SX

4 S

5 SSX

6 X

什麼是enqueue resource

Lock有三種可能的狀態:已獲得,轉換或者等待。對於某一個lock,可能一些session已經獲得該lock,某些session請求轉換,也有某些session在請求持有但無法成功而導致等待。所以,對於一個lock,需要三個隊列來描述這些session的狀態。這個三個隊列,分別稱爲Owner,waiter和convert隊列,由一個結構來管理,就是enqueue resource。

 

enqueue是有名字的,其名字就是對應的lock的類型加上 ID1,ID2參數構成,形如<TYPE-ID1-ID2>。Enqueue resource的結構,其頭部是該enqueue的名字,然後就是指向三個隊列的指針。

 

通過v$resource視圖可以查看當前系統中的enqueue。

 

由於系統中有很多類型的lock同時存在,那麼enqueue resource結構實際上是一個數組,其長度由隱含參數_enqueue_resources控制,也就是說,該參數控制了系統中可同時存在的lock的數量。如果超過,則會報以下錯誤:

ORA-00052: "maximum number of enqueueresources exceeded"

通過v$resource_limit視圖可以查看系統中各種資源的利用情況。


什麼是enqueue lock

 

enqueue lock就是lock本身。oracle使用了和enqueue reouserce分離的另外一個數組來管理enqueue lock,這個數組的長度由隱含參數_enqueue_locks控制。

 

通過視圖v$enqueue_lock可以查看該數組中的具體內容。

 

什麼是enqueue hash

 

通過上面關於enqueueresource的描述,我們可以知道,oracle查找一個lock時,需要先在enqueue resource數上查找到該lock的位置。

 

如果每次都在數組上順序查找,顯然效率較低。我們知道hash是一種高效的查找算法,所以oracle對於enqueue resource的查找也採用了hash方式,引入了一個hash數組,其大小由隱含參數_enqueue_hash控制。

 

通過對enqueue的名字<TYPE-ID1-ID2>進行 hash計算,得到的結果就是某個enqueue resource在 hash數組中的位置,也就是定位到了具體的hash bucket。如果多個enqueue resource的hash值相同,則在同一個bucket中形成一個鏈表。

 

相應的,爲了保護這個hash數組,需要引入一個 latch:enqueue hash chain。該latch有若干個子latch,由隱含參數_enqueue_hash_chain_latches控制

 

什麼是enqueue freelist

 

同樣的,對於enqueueresource數組中的空閒位置,需要通過一個freelist列表來管理,這樣每次在請求新的位置時,不至於要掃描整個數組。enqueue freelist由enqueues latch的保護。

 

實際上,enqueueresource的Hash管理方式,和buffer cache/library cache的管理方式非常的相像。如果想更深入的瞭解enqueuehash,resource和lock,可以dump出具體的結果看看:

 

alter session set events ’immediate tracename enqueues level 3’;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章