DB2中的maxlocks locklist 參數

 

 

maxlocks數據庫配置參數用於指定觸發鎖定升級的百分比。獲取觸發鎖定升級的鎖定的表可能不受影響。每個鎖在內存中都需要一定的內存空間,爲了減少鎖需要的內存開銷,DB2提供了鎖升級這一功能。鎖升級是通過對錶加上非意圖性的表鎖,同時釋放行鎖來減少鎖的數目,從而達到減少鎖需要的內存開銷的目的的。鎖升級由數據庫管理器自動完成,數據庫的配置參數鎖列表頁面數(LOCKLIST)和應用程序佔有百分比(MAXLOCKS)直接影響鎖升級的處理.

應用程序超出允許它具有的總的鎖內存百分比(MAXLOCKS 值)的情況。因此,數據庫執行鎖升級,將應用程序的鎖內存百分比降低到MAXLOCKS指定的百分比之下。下圖說明了更爲常見的情況:到達總的鎖內存限制,因此執行鎖升級來釋放鎖內存。

鎖升級問題可以通過增加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鎖衝突,鎖升級不能成功。

如果鎖升級失敗,引起鎖升級的應用程序將接到一個–912的SQLCODE。

下面我們舉一個實際的例子。

首先,運行下面的命令以打開針對鎖的DB2監視器:

db2 -v update monitor switches using lock on

db2 -v terminate

然後收集數據庫快照:

db2 -v get snapshot for database on sample | grep –i lock

在快照輸出中,檢查下列各項:

Locks held currently = 21224

Lock waits = 24683

Time database waited on locks (ms) = 32875

Lock list memory in use (Bytes) = 87224

Deadlocks detected = 89

Lock escalations = 8

Exclusive lock escalations = 12

Agents currently waiting on locks = 0

Lock Timeouts = 0

Internal rollbacks due to deadlock = 0

如果“Lock list memory in use (Bytes)”超過定義的LOCKLIST大小的50%,那麼就增加LOCKLIST數據庫配置參數中的4KB頁的數量。

如果發生了“Lock escalations>0”或“Exclusive lock escalations>0”,則應該或者增大LOCKLIST或者MAXLOCKS,抑或同時增大兩者。查看“Locks held currently”、“Lock waits”、“Time database waited on locks (ms)”、“Agents currently waiting on locks”和“Deadlocks detected”中是否存在高值,如果有的話,就可能是差於最優訪問計劃、事務時間較長或者應用程序併發問題的症狀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章