探索系列——神人steve adams之著oracle8i interal service(九)

wisdomone1發表於2010-04-23
  當一個會話release 一個enqueue lock,它會檢查lock request和conversion queues(對於某個資源),如果可能,給下個程式傳送通知,你可以持有這個資源的鎖了.

  程式在等待前,也會設定一個alarm,這個程式會發生enqueue wait.超時間隔或期間依賴於資源的型別。對於大多數入隊,入隊等待超時是3秒.

  當嘗試請求一次enqueue lock時,如果發生連續的等待,會在系統或會話中記錄下來。但是,v$sysstat的入隊等待統計僅僅是遞增。請注意:v$sysstat入隊超時資訊並不表示
入隊等待超時次數。相反,當入隊請求或入隊轉變被中斷時,這個統計資訊值會遞增時。這可能與一個分散式事務超時有關,但通常與在no-wait mode請求鎖有關.

          
         
          fixed array free lists
   每個oracle固定佇列的free slots在一個自由列表free list中維護。對於這種佇列,free lists 頭部的指標會指向這個佇列的其中free slots之一.相反,這個slot,會有一個指標指向自由列表下一個free slot。
  
   free slots經常從free list的頭部得到,經常返回free list的頭部。這意味著free list的尾部經常不會用,當有必要時,hwm僅僅先前進展.


   如果v$sysstat發現大量入隊等待,透過x$ksqst得到或發現對於某種資源等待的故障或問題.


   大多建議增加enqueue_resources減少入隊等待。但請注意這個沒有作用。oracle將會發生ora-52或53錯誤,如果在enqueue resource(或enqueue locks fixed array)中找不到free slot.除於以外,
配置enqueue_resource和_enqueue_locks起效不明顯.
   v$resource_limit可以調整enqueue_resources和_enqueue_locks,確認你不會用完array的slots。因為array的slots會分別採用72bytes和60bytes的次序.我想在曾經最大利用的空間之上維護或佔用20%的空間.






   deadlock detection

    oracle自動實現enqueue locking死鎖的死鎖檢測.如果發生一次入隊等待超時,就會產生死鎖檢測,如果所需要的資源型別與死鎖關係比較大,如果鎖的狀態沒有改變。

    如果發現死鎖,會話只是終止或rollback當前的語句,以打破死鎖。注意,僅僅是當前語句的rollback,沒必要整個事務.oracle會在每個語句開始時,設定一個隱式儲存點,叫作預設儲存點,
只是rollback到這個儲存點。
    會話發現一個死鎖時,會產生ora-60錯誤。v$sysstat會記錄發生了多少次enqueue deadlock。
 



blocking locks
   有多種診斷blocking lock情況的方式,正常處理是透過殺掉產生麻煩的會話.


   blocking locks基本是tx(transaction) locks on tm(table) locks。


   一些應用開發者用select for update nowait來避免blocking locks.但是如果採用這種方式允許使用者交涉,得到一個sub-exclusive的鎖和release鎖,此時會產生更為細微的lock。假如一個使用者出外吃飯時,
正對一個表持有sub-exclusive lock,此時對於表任何鎖請求將會阻塞請求佇列的頭部,所有其它的鎖請求將會在它之後排隊.
 
 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-660588/,如需轉載,請註明出處,否則將追究法律責任。

相關文章