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