Posted on 2010-04-23 10:56
Prayer 閱讀(235)
評論(0) 編輯 收藏 引用 所屬分類:
DB2
鎖升級問題可以通過增加LOCKLIST和MAXLOCKS數據庫參數的大小來解決。但是,如果仍然遇到鎖定問題,應檢查是否因未能提交事務而未釋放已更新行上的鎖。
每個數據庫都有一個鎖列表,該列表包含所有同時連接到數據庫的應用程序所持有的鎖。在32位平臺上,一個對象上的第一個鎖要求占64字節,而其他的鎖要求占32字節。在64位平臺上,第一個鎖要求占112字節,而其他鎖要求占56字節。
當一個應用程序使用的LOCKLIST的百分比達到MAXLOCKS時,數據庫管理器將執行一次鎖升級(lock escalation),在這個操作中將使行鎖轉換成單獨的一個表鎖。而且,如果LOCKLIST快要耗盡,數據庫管理器將找出持有一個表上最多行鎖的連接,并將這些行鎖轉換成表鎖,以釋放LOCKLIST內存。鎖定整個表會大大降低并發性,死鎖的幾率也就增加了。
● LOCKLIST表明分配給鎖列表的存儲容量。每個數據庫都有一個鎖列表,鎖列表包含了并發連接到該數據庫的所有應用程序所持有的鎖。鎖定是數據庫管理器用來控制多個應用程序并發訪問數據庫中數據的機制。行和表都可以被鎖定。
● MAXLOCKS定義了應用程序持有的鎖列表的百分比,在數據庫管理器執行鎖升級之前必須填充該鎖列表。當一個應用程序所使用的鎖列表百分比達到MAXLOCKS 時,數據庫管理器會升級這些鎖,這意味著用表鎖代替行鎖,從而減少列表中鎖的數量。當任何一個應用程序所持有的鎖數量達到整個鎖列表大小的這個百分比時,對該應用程序所持有的鎖進行鎖升級。如果鎖列表用完了空間,那么也會發生鎖升級。數據庫管理器通過查看應用程序的鎖列表并查找行鎖最多的表,來決定對哪些鎖進行升級。如果用一個表鎖替換這些行鎖,將不再會超出MAXLOCKS 值,那么鎖升級就會停止。否則,鎖升級就會一直進行,直到所持有的鎖列表百分比低于MAXLOCKS。MAXLOCKS參數乘以MAXAPPLS參數的值不能小于100。
LOCKLIST配置參數的計算方法如下(操作系統為32位平臺):
(1) 計算鎖列表大小的下限:(512 * 32 * MAXAPPLS)/4096。其中,512是每個應用程序平均所含鎖數量的估計值,32是對象(已有一把鎖)上每把鎖所需的字節數。
(2) 計算鎖列表大小的上限:(512 * 64 * MAXAPPLS)/4096。其中,64是某個對象上第一把鎖所需的字節數。
(3) 對于您的數據,估計可能具有的并發數,并根據您的預計為鎖列表選擇一個初始值,該值位于您計算出的上限和下限之間。
MAXLOCKS配置參數的計算方法如下:
MAXLOCKS = 100 * (512鎖/應用程序 * 32字節/鎖 * 2)/(LOCKLIST * 4096字節)
該公式允許任何應用程序持有的鎖是平均數的兩倍。如果只有幾個應用程序并發地運行,則可以增大MAXLOCKS,因為在這些條件下鎖列表空間中不會有太多爭用。
鎖升級會在以下兩種情況下被觸發:
● 某個應用程序請求的鎖所占用的內存空間超出了MAXLOCKS和LOCKLIST的乘積大小。這時,數據庫管理器將試圖通過為提出鎖請求的應用程序申請表鎖,并釋放行鎖來節省空間。
● 在一個數據庫中已被加上的全部鎖所占的內存空間超出了LOCKLIST定義的大小。這時,數據庫管理器也將試圖通過為提出鎖請求的應用程序申請表鎖,并釋放行鎖來節省空間。
雖然升級過程本身并不用花很多時間,但是鎖定整個表(相對于鎖定個別行)降低了并發性,而且數據庫的整體性能可能會由于對受鎖升級影響的表的后續訪問而降低。
在設計良好的數據庫中,很少發生鎖定升級。如果鎖定升級將并行性降低到不可接受的程度(由lock_escalation監視元素監視),那么就需要分析問題并決定如何解決此問題。
鎖升級是有可能失敗的,比如,現在一個應用程序已經在一個表上加有IX鎖,表中的某些行上加有X鎖,另一個應用程序又來請求表上的IS鎖,以及很多行上的S鎖,由于申請的鎖數目過多引起鎖的升級。數據庫管理器試圖為該應用程序申請表上的S鎖來減少所需要的鎖的數目,但S鎖與表上原有的IX鎖沖突,鎖升級不能成功。