latch和lock的區別
Latch是Oracle提供的輕量級鎖資源,用於快速,短時間的鎖定資源,防止多個併發程式同時修改訪問某個共享資源,他只工作在記憶體中,我們可以不大準確的說,記憶體中資源的鎖叫latch,資料庫物件(表,索引等)的鎖叫Lock。
本文向各位闡述Oracle的Latch機制,Latch,用金山詞霸翻譯是門插栓,閉鎖,專業術語叫鎖存器,我開始接觸時就不大明白為什麼不寫Lock,不都是鎖嗎?只是翻譯不同而以?研究過後才知道兩者有很大的區別。
Latch是Oracle提供的輕量級鎖資源,他用於快速,短時間的鎖定資源,防止多個併發程式同時修改訪問某個共享資源,他只工作在記憶體中,我們可以不大準確的說,記憶體中資源的鎖叫latch,資料庫物件(表,索引等)的鎖叫Lock。比如資料快取中的某個塊要被讀取,我們會獲得這個塊的latch,這個過程叫做pin,另外一個程式恰好要修改這個塊,他也要pin這個塊,此時他必須等待,當前一個程式釋放latch後才能pin住,然後修改,如果多個程式同時請求的話,他們之間將出現競爭,並沒有一個入隊機制,一旦前面程式釋放所定,後面的程式就蜂擁而上,沒有先來後到的概念,這個和Lock是有本質區別的,這一切都發生的非常快,因為Latch的特點是快而短暫,當然這個只是大致過程,細節部分在後面討論
先來看下Latch和Lock的區別,
1. Latch是對記憶體資料結構提供互斥訪問的一種機制,而Lock是以不同的模式來套取共享資源物件,各個模式間存在著相容或排斥,從這點看出,Latch的訪問,包括查詢也是互斥的,任何時候,只能有一個程式能pin住記憶體的某一塊,幸好這個過程是相當的短暫,否則系統效能將沒的保障,現在從9I開始,允許多個程式同時查詢相同的記憶體塊,但效能並沒有想象中的好。
2. Latch只作用於記憶體中,他只能被當前例項訪問,而Lock作用於資料庫物件,在RAC體系中例項間允許Lock檢測與訪問
3. Latch是瞬間的佔用,釋放,Lock的釋放需要等到事務正確的結束,他佔用的時間長短由事務大小決定
4. Latch是非入隊的,而Lock是入隊的
5. Latch不存在死鎖,而Lock中存在(死鎖在Oracle中是非常少見的)
看看下面這個例子,你會感覺到Latch的存在
SQL> CREATE TABLE MYTEST AS
SELECT OBJECT_NAME
FROM USER_OBJECTS
WHERE ROWNUM <= 4;
Table created
SQL> SET TIMING ON
SQL>
DECLARE lv_name VARCHAR2(25) := '';
BEGIN
FOR i IN 1..100000 LOOP
SELECT OBJECT_NAME INTO lv_name FROM MYTEST WHERE ROWNUM = 1;
END LOOP;
END;
/
PL/SQL procedure successfully completed
Executed in 3.359 seconds
這個程式不斷的訪問表上的同一個資料塊,他先會物理讀取資料塊到資料緩衝區,然後在記憶體中不斷的獲取這個塊的latch,現在只有單個程式,執行的還好,10萬次用了3秒多,但當我拉出4個視窗同時併發的執行這個語句時,問題就出現了,多個程式PIN同一個資料塊,每個大概花了15秒,並且看到他們一個一個的結束,到最後只剩一個時一閃就過去了,因為沒人和他搶了,這個實驗展現了Latch競爭的現象,對於9I提出的查詢可以共享Latch在此我表示了質疑。
現在來看看程式獲取Latch的詳細過程,任何時候,只有一個程式可以訪問記憶體中的某一個塊(9I提出的Latch共享我不想考慮),如果程式因為別的程式正佔用塊而無法獲得Latch時,他會對CPU進行一次spin(旋轉),時間非常的短暫,spin過後繼續獲取,不成功仍然spin,直到spin次數到達閥值限制(這個由隱含引數_spin_count指定),此時程式會停止spin,進行短期的休眠,休眠過後會繼續剛才的動作,直到獲取塊上的Latch為止。程式休眠的時間也是存在演算法的,他會隨著spin次數而遞增,以釐秒為單位,如1,1,2,2,4,4,8,8,。。。休眠的閥值限制由隱含引數_max_exponential_sleep控制,預設是2秒,如果當前程式已經佔用了別的Latch,則他的休眠時間不會太長(過長會引起別的程式的Latch等待),此時的休眠最大時間有隱含引數_max_sleep_holding_latch決定,預設是4釐秒。這種時間限制的休眠又稱為短期等待,另外一種情況是長期等待鎖存器(Latch Wait Posting),此時等待程式請求Latch不成功,進入休眠,他會向鎖存器等待連結串列(Latch Wait List)壓入一條訊號,表示獲取Latch的請求,當佔用程式釋放Latch時會檢查Latch Wait List,向請求的程式傳遞一個訊號,啟用休眠的程式。Latch Wait List是在SGA區維護的一個程式列表,他也需要Latch來保證其正常執行,預設情況下share pool latch和library cache latch是採用這個機制,如果將隱含引數_latch_wait_posting設定為2,則所有Latch都採用這種等待方式,使用這種方式能夠比較精確的喚醒某個等待的程式,但維護Latch Wait List需要系統資源,並且對Latch Wait List上Latch的競爭也可能出現瓶頸。
如果一個程式請求,旋轉,休眠Latch用了很長時間,他會通知PMON程式,檢視Latch的佔用程式是否已經意外終止或死亡,如果是則PMON會清除釋放佔用的Latch資源。
現在大家可以明白,對Latch獲取的流程了,請求-SPIN-休眠-請求-SPIN-休眠。。。佔用,這裡有人會問為什麼要SPIN,為什麼不直接休眠等待?這裡要明白休眠意味著什麼,他意味著暫時的放棄CPU,進行上下文切換(context switch),這樣CPU要儲存當前程式執行時的一些狀態資訊,比如堆疊,訊號量等資料結構,然後引入後續程式的狀態資訊,處理完後再切換回原來的程式狀態,這個過程如果頻繁的發生在一個高事務,高併發程式的處理系統裡面,將是個很昂貴的資源消耗,所以他選擇了spin,讓程式繼續佔有CPU,執行一些空指令,之後繼續請求,繼續spin,直到達到_spin_count值,這時會放棄CPU,進行短暫的休眠,再繼續剛才的動作,Oracle軟體就是這麼設計的,世界大師們的傑作,自然有他的道理,我就不在這上面再費文字了。
系統發生關於Latch的等待是沒發避免的,因為這是Oracle的運作機制,當你看到很高的Latch get時並不意味著你的系統需要調整,有時候很高的get值背後只有很短的等待時間,我們調整的物件應該以消耗的時間來圈定,而不是看到一個很高的獲取次數值,當然,獲取值異常的高出別的等待時間幾十萬倍時我們還是要關心的,Oracle關於Latch的等待非常繁多,主要的包括share pool,library cache,cache buffer chains,buffer busy wait,每一個的調整幾乎都可以寫幾頁紙,以後慢慢完成吧。
本文轉自http://blog.csdn.net/zhangjay/article/details/6406179
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29702473/viewspace-1218542/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【 latch和lock的區別 】
- Latch和Lock的區別(轉)
- Oracle中latch和lock的區別Oracle
- Latch 與 Lock 的區別
- snapshot 和 view,lock 和 latch 的區別View
- 【鎖】Latch、lock、 pin的區別
- Lock 和 synchronized的區別synchronized
- Oracle Latch & LockOracle
- ORACLE LOCK,LATCH,PINOracle
- 【筆記】lock and latch筆記
- enqueue, latch的理解及區別ENQ
- 基礎才是重中之重~lock和monitor的區別
- synchronized與Lock的區別synchronized
- mutex,latch,lock,enqueue hash chains latch基礎概念MutexENQAI
- Lock、Synchronized鎖區別解析synchronized
- latch:library cache lock等待事件事件
- spin_lock、spin_lock_irq、spin_lock_irqsave區別【轉】
- 【面試普通人VS高手系列】lock和synchronized區別面試synchronized
- synchronized與Lock的區別與使用詳解synchronized
- library cache lock和library cache pin區別總結
- 共享池之六:shared pool latch/ library cache latch /lock pin 簡介
- 讀書筆記-高階owi與oracle效能調整-latch和lock筆記Oracle
- 【原創】說說你是如何理解Oracle資料庫中latch和enqueue lock的?Oracle資料庫ENQ
- ../和./和/的區別
- 和 的區別
- as 和 with的區別
- ||和??的區別
- /*和/**的區別
- 10.2出現SQL Memory Manager latch型別的latch freeSQL型別
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- 【ASK_ORACLE】Library cache pin 與 library load lock的關係和區別Oracle
- ./ 和sh 的區別
- JQuery this和$(this)的區別jQuery
- jquery $(this) 和this的區別jQuery
- T和?的區別
- ++a和a++的區別
- makefile =和:=的區別