Oracle Rdbms在實際操作中運用到各種類型的相關的鎖定機制,Oracle latch就是其經常使用的一種,以下的文章主要是介紹latch(閂)的概念,以及理解latch的實現方法並說明引起latch衝突的原因。
什麼是Oracle latch
Latch是用於保護SGA區中共用資料結構的一種序列化鎖定機制。Latch的實現是與作業系統相關的,尤其和一個進程是否需要等待一個latch、需要等待多長時間有關。
Latch 是一種能夠極快地被擷取和釋放的鎖,它通常用於保護描述buffer cache中block的資料結構。與每個latch相聯絡的還有一個清除過程,當持有latch的進程成為死進程時,該清除過程就會被調用。Latch 還具有相關層級,用於防止死結,一旦一個進程在某個層級上得到一個Oracle latch,它就不可能再獲得等同或低於該層級的latch。
Latch與Enqueue(隊列)
Enqueue 是Oracle使用的另一種鎖定機制,它更加複雜,允許幾個並發進程不同程度地共用某些資源。任何可被並發使用的對象均可使用enqueue加以保護。一 個典型的例子是表的鎖定,我們允許在一個表上有不同層級的共用。與latch不同之處在於,enqueue是使用作業系統特定的鎖定機制,一個 enqueue允許使用者在鎖上存貯一個標記,來表明請求鎖的模式。
作業系統lock manager跟蹤所有被鎖定資源,如果某個進程不能擷取它所請求的那種鎖,作業系統就把請求進程置於一個等待隊列中,該隊列按FIFO原則調度,而在 latches中是沒有象enqueue中排序的等待隊列,latch等待進程要麼使用定時器來喚醒和重試,要麼spin(只用於多處理器情況下)。
何時需要latch
當一個進程準備訪問SGA中的資料結構時,它就需要獲得一個lOracle atch。當進程獲得latch後,它將一直持有該latch直到它不再使用此資料結構,這時latch才會被釋放。可通過latch名稱來區分它所保護的不同資料結構。
Oracle 使用元指令對latch進行操作, 當所需的latch已被其他進程持有時,執行指令進程將停止執行部分指令,直到該latch被釋放為止。從根本上講,latch防止並發訪問共用資料結 構,由於設定和釋放latch的指令是不可分割的,作業系統就可以保證只有一個進程獲得latch,又由於這隻是單條指令,所以執行速度很快。
latch 被持有的時間是很短,而且提供了當持有人不正常中斷時的清除機制,該清除工作是由Oracle後台進程PMON來完成的。
什麼導致latch衝突
Latch 保護SGA中的資料結構被多個使用者同時訪問,如果一個進程不能立即得到所需latch,它就必須等待,這就導致了CPU的額外負擔和系統的速度降低。額外 的CPU使用是進程‘spining’導致的,‘spining’是指進程定時地重複嘗試擷取Oracle latch,在連續兩次之間,進程處於休眠狀態,在得到 latch之前,spining過程將重複進行下去。
如何標識內部latch的衝突
Server manager monitor是一個相當有用的來監視latch等待、請求和衝突的工具。也可查詢相關的資料字典表:v$latch, v$latchholder, v$latchname。
v$latch 表的每一行包括了對不同類型latch的統計,每一列反映了不同類型的latch請求的活動情況。不同類型的latch請求之間的區別在於,當latch 不可立即獲得時,請求進程是否繼續進行。按此分類,latch請求的類型可分為兩類:willing-to-wait和immediate。
Willing-to-wait : 是指如果所請求的latch不能立即得到,請求進程將等待一很短的時間後再次發出請求。進程一直重複此過程直到得到latch。
Immediate:是指如果所請求的latch不能立即得到,請求進程就不再等待,而是繼續執行下去。
在v$latch中的以下欄位反映了Willing-to-wait請求:
GETS---成功地以Willing-to-wait請求類型請求一個Oracle latch的次數。
MISSES---初始以Willing-to-wait請求類型請求一個latch不成功的次數。
SLEEPS---初始以Willing-to-wait請求類型請求一個latch不成功後,進程等待擷取latch的次數。
在v$latch中的以下欄位反映了Immediate類請求:
IMMEDIATE_GETS---以Immediate請求類型成功地獲得一個latch的次數。
IMMEDIATE_MISSES---以Immediate請求類型請求一個Oracle latch不成功的次數。