Latch和Lock的區(qū)別是什么-創(chuàng)新互聯(lián)

本篇內(nèi)容介紹了“Latch和Lock的區(qū)別是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

發(fā)展壯大離不開廣大客戶長期以來的信賴與支持,我們將始終秉承“誠信為本、服務(wù)至上”的服務(wù)理念,堅持“二合一”的優(yōu)良服務(wù)模式,真誠服務(wù)每家企業(yè),認真做好每個細節(jié),不斷完善自我,成就企業(yè),實現(xiàn)共贏。行業(yè)涉及茶樓設(shè)計等,在重慶網(wǎng)站建設(shè)公司、全網(wǎng)整合營銷推廣、WAP手機網(wǎng)站、VI設(shè)計、軟件開發(fā)等項目上具有豐富的設(shè)計經(jīng)驗。

本文向各位闡述OracleLatch機制,Latch,用金山詞霸翻譯是門插栓,閉鎖,專業(yè)術(shù)語叫鎖存器,我開始接觸時就不大明白為什么不寫Lock,不都是鎖嗎?只是翻譯不同而以?研究過后才知道兩者有很大的區(qū)別。

  Oracle中鎖的信息是數(shù)據(jù)塊的一部分,是物理的,并不是邏輯上屬于某個表或者某個行。Latch是Oracle提供的輕量級鎖資源,他用于快速,短時間的鎖定資源,防止多個并發(fā)進程同時修改訪問某個共享資源,他只工作在內(nèi)存中, 我們可以不大準(zhǔn)確的說,內(nèi)存中資源的鎖叫l(wèi)atch,數(shù)據(jù)庫對象(表,索引等)的鎖叫Lock。比如數(shù)據(jù)緩存中的某個塊要被讀取,我們會獲得這個塊的 latch,這個過程叫做pin,另外一個進程恰好要修改這個塊,他也要pin這個塊,此時他必須等待,當(dāng)前一個進程釋放latch后才能pin住,然后 修改,如果多個進程同時請求的話,他們之間將出現(xiàn)競爭,沒有一個入隊機制,一旦前面進程釋放所定,后面的進程就蜂擁而上,沒有先來后到的概念,這個和 Lock是有本質(zhì)區(qū)別的,這一切都發(fā)生的非常快,因為Latch的特點是快而短暫,當(dāng)然這個只是大致過程,細節(jié)部分在后面討論

  先來看下Latch和Lock的區(qū)別,

  1. Latch是對內(nèi)存數(shù)據(jù)結(jié)構(gòu)提供互斥訪問的一種機制,而Lock是以不同的模式來套取共享資源對象,各個模式間存在著兼容或排斥,從這點看出,Latch 的訪問,包括查詢也是互斥的,任何時候,只能有一個進程能pin住內(nèi)存的某一塊,幸好這個過程是相當(dāng)?shù)亩虝?,否則系統(tǒng)性能將沒的保障,現(xiàn)在從9I開始,允 許多個進程同時查詢相同的內(nèi)存塊,但性能并沒有想象中的好。

  2. Latch只作用于內(nèi)存中,他只能被當(dāng)前實例訪問,而L ock作用于數(shù)據(jù)庫對象,在RAC體系中實例間允許Lock檢測與訪問

  3. Latch是瞬間的占用,釋放,Lock的釋放需要等到事務(wù)正確的結(jié)束,他占用的時間長短由事務(wù)大小決定

  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

  這個進程不斷的訪問表上的同一個數(shù)據(jù)塊,他先會物理讀取數(shù)據(jù)塊到數(shù)據(jù)緩沖區(qū),然后在內(nèi)存中不斷的獲取這個塊的latch,現(xiàn)在只有單個進程,運 行的還好,10萬次用了3秒多,但當(dāng)我拉出4個窗口同時并發(fā)的運行這個語句時,問題就出現(xiàn)了,多個進程PIN同一個數(shù)據(jù)塊,每個大概花了15秒,并且看到 他們一個一個的結(jié)束,到最后只剩一個時一閃就過去了,因為沒人和他搶了,這個實驗展現(xiàn)了Latch競爭的現(xiàn)象,對于9I提出的查詢可以共享Latch在此 我表示了質(zhì)疑。

      產(chǎn)生Latch的原因主要是:

      1、太多的會話訪問相同的數(shù)據(jù)塊導(dǎo)致熱塊的產(chǎn)生

      2、共享池有太多的sql語句需要軟解析,沒有使用綁定變量

  現(xiàn)在來看看進程獲取Latch的詳細過程,任何時候,只有一個進程可以訪問內(nèi)存中的某一個塊(9I提出的Latch共享我不想考慮),如果進程 因為別的進程正占用塊而無法獲得Latch時,他會對CPU進行一次spin(旋轉(zhuǎn)),時間非常的短暫,spin過后繼續(xù)獲取,不成功仍然spin,直到 spin次數(shù)到達閥值限制(這個由隱含參數(shù)_spin_count指定),此時進程會停止spin,進行短期的休眠,休眠過后會繼續(xù)剛才的動作,直到獲取 塊上的Latch為止。進程休眠的時間也是存在算法的,他會隨著spin次數(shù)而遞增,以厘秒為單位,如1,1,2,2,4,4,8,8,。。。休眠的閥值 限制由隱含參數(shù)_max_exponential_sleep控制,默認是2秒,如果當(dāng)前進程已經(jīng)占用了別的Latch,則他的休眠時間不會太長(過長會 引起別的進程的Latch等待),此時的休眠大時間有隱含參數(shù)_max_sleep_holding_latch決定,默認是4厘秒。這種時間限制的休 眠又稱為短期等待,另外一種情況是長期等待鎖存器(Latch Wait Posting),此時等待進程請求Latch不成功,進入休眠,他會向鎖存器等待鏈表(Latch Wait List)壓入一條信號,表示獲取Latch的請求,當(dāng)占用進程釋放Latch時會檢查Latch Wait List,向請求的進程傳遞一個信號,激活休眠的進程。Latch Wait List是在SGA區(qū)維護的一個進程列表,他也需要Latch來保證其正常運行,默認情況下share pool latch和library cache latch是采用這個機制,如果將隱含參數(shù)_latch_wait_posting設(shè)置為2,則所有Latch都采用這種等待方式,使用這種方式能夠比較 精確的喚醒某個等待的進程,但維護Latch Wait List需要系統(tǒng)資源,并且對Latch Wait List上Latch的競爭也可能出現(xiàn)瓶頸。

  如果一個進程請求,旋轉(zhuǎn),休眠Latch用了很長時間,他會通知PMON進程,查看Latch的占用進程是否已經(jīng)意外終止或死亡,如果是則PMON會清除釋放占用的Latch資源。

  現(xiàn)在大家可以明白,對Latch獲取的流程了,請求-SPIN-休眠-請求-SPIN-休眠。。。占用,這里有人會問為什么要SPIN,為什么 不直接休眠等待?這里要明白休眠意味著什么,他意味著暫時的放棄CPU,進行上下文切換(context switch),這樣CPU要保存當(dāng)前進程運行時的一些狀態(tài)信息,比如堆棧,信號量等數(shù)據(jù)結(jié)構(gòu),然后引入后續(xù)進程的狀態(tài)信息,處理完后再切換回原來的進程 狀態(tài),這個過程如果頻繁的發(fā)生在一個高事務(wù),高并發(fā)進程的處理系統(tǒng)里面,將是個很昂貴的資源消耗,所以他選擇了spin,讓進程繼續(xù)占有CPU,運行一些 空指令,之后繼續(xù)請求,繼續(xù)spin,直到達到_spin_count值,這時會放棄CPU,進行短暫的休眠,再繼續(xù)剛才的動作,Oracle軟件就是這 么設(shè)計的,世界大師們的杰作,自然有他的道理,我就不在這上面再費文字了。

  系統(tǒng)發(fā)生關(guān)于Latch的等待是沒發(fā)避免的,因為這是Oracle的運作機制,當(dāng)你看到很高的Latch get時并不意味著你的系統(tǒng)需要調(diào)整,有時候很高的get值背后只有很短的等待時間,我們調(diào)整的對象應(yīng)該以消耗的時間來圈定,而不是看到一個很高的獲取次 數(shù)值,當(dāng)然,獲取值異常的高出別的等待時間幾十萬倍時我們還是要關(guān)心的,Oracle關(guān)于Latch的等待非常繁多,主要的包括share pool,library cache,cache buffer chains,buffer busy wait,每一個的調(diào)整幾乎都可以寫幾頁紙,以后慢慢完成吧。

“Latch和Lock的區(qū)別是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

新聞標(biāo)題:Latch和Lock的區(qū)別是什么-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://muchs.cn/article42/ejohc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、手機網(wǎng)站建設(shè)、做網(wǎng)站網(wǎng)頁設(shè)計公司、標(biāo)簽優(yōu)化、全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名