DB2 鎖的監控

sqiutz發表於2010-03-12

      鎖是資料庫為了控制併發資料的完整性而引入的機制,在併發應用中出現鎖現象並不可怕,鎖現象通常分為死鎖和鎖等待兩種情形。   

      死鎖是因為兩個併發的程式或者執行緒同時各自佔有一個資源,又需要佔有對方資源,但又都各不相讓造成的,這通常是因為程式在併發上考慮不周造成的。   

      鎖等待則是資料庫中最普通的情況,一各應用使用資料期間必然要加鎖,防止其他程式或應用破壞資料,其他程式或應用在此期間不得不等待前一個應用釋放鎖。鎖等待時間引數是可調的,但要視實際應用情況而定,比如在網路環境中,複雜應用環境,或者對實時性要求不高的環境中,可以將鎖等待時間調大一些,有些情況要調小一些。鎖等待不同於死鎖,死鎖屬於程式併發不當,需要調整程式併發機制,鎖等待則屬於效能問題,可能需要調整程式的sql語句。   

      不管是死鎖還是鎖等待,資料庫都有相應引數可調,也有相應的工具可以捕獲和分析,以下是鎖處理的通常辦法。      (1) 檢視和更改與鎖相關的主要資料庫引數   

      (2) 檢視當前併發應用   

      (3) 檢視和更改快照引數,獲取快照   ·

      (4) 使用事件檢視器,檢視和更改與鎖相關的主要配置引數   

 

      利用db2 get db cfg,在引數列表中尋找DLCHKTIME和LOCKTIMEOUT兩個引數。   

      -DLCHKTIME 單位是毫秒,是DB2檢查死鎖的間隔時間,假設該值為10000ms,則意味著每隔10秒鐘檢查一下當前資料庫中有無死鎖存在,如有死鎖,會選擇回滾其中的某一個事務,讓另外一個事務完成交易。   

      -LOCKTIMEOUT單位是秒,是鎖等待最長時間,超過該時間仍未獲得鎖,則返回錯誤。設定提示:預設情況下,LOCKTIMEOUT是-1,意味著鎖等待時間無限期,這和實際應用需求一般是不太相符的,需要將其值設為大於0的一個數。   -DLCHKTIME時間通常要設得比LOCKTIMEOUT時間小一些,否則未等發現死鎖,就會被以鎖等待超時而返回錯誤更改方法:db2 update db cfg using locktimeout 10   

      檢視當前併發應用,利用db2 list applications 或db2 list applications show detail 或 db2 list applications for database dbname [show detail]。該命令可以檢視當前是否有多個應用在連線著資料庫,從而排查是否有併發的存在。   

      檢視和更改快照引數,如果在合理設定了DLCHKTIME和LOCKTIMEOUT引數仍然出現鎖現象,可以檢視快照或者建立事件監控器來分析原因。要採用快照,首先要開啟快照開關,利用db2 get monitor switches,輸出中將包含以下引數。

      檢視快照資訊,檢視資料庫管理器級別快照資訊:db2 get snapshot for dbm;檢視資料庫級別快照資訊:db2 get snapshot for database on dbname;檢視應用級別快照資訊:db2 get snapshot for application agentid appl-handler;檢視錶級別快照資訊:db2 get snapshot for tables on dbname;檢視鎖快照資訊:db2 get snapshot for locks on dbname或db2 get snapshot for locks on for application agentid appl-handler;檢視動態sql語句快照資訊:db2 get snapshot for dynamic sql on dbname   

      使用事件檢視器,可以使用時間檢視器收集鎖事件,SQL語句事件,從而根據事件分析鎖原因。事件型別,使用事件監控器,首先要選定所關注的事件型別,DB2中有很多事件型別,可以用於鎖分析的通常會用到以下三種:DEADLOCKS; DEADLOCKS WITH DETAILS;STATEMENTS。步驟:建立事件監控器:create event monitor evmname for eventtype write to file ‘directory’ ;例:create event monitor mymonitor for deadlocks, statements   write to file ‘c:\temp’ ;把事件監控器開啟,接上例:set event monitor mymonitor state 1 /*注:1為開啟,0為關閉*/事件監控器開始工作,當所有應用斷掉連線後,將事件記錄下來;檢視事件細節:db2evmon –path ‘c:\temp’

相關文章