兩者皆可透過參數調整緩解,但根治需回歸應用層面。
| 參數 | 單位 | 含義 | 建議設定 |
|---|---|---|---|
DLCHKTIME | 毫秒 | 死結檢測間隔 | 預設 10000 (10秒);設小於 LOCKTIMEOUT |
LOCKTIMEOUT | 秒 | 鎖等待最長時間,-1=無限等待 | 必須設 >0 (如 30~60),避免永久阻塞 |
LOCKLIST | 4KB 頁 | 鎖清單記憶體上限 | 視併發量調大,防止鎖升級過早 |
MAXLOCKS | % | 單應用佔用鎖清單上限觸發升級 | 預設 10%,高併發可調 20~50% |
# 修改範例
db2 update db cfg using LOCKTIMEOUT 30
db2 update db cfg using DLCHKTIME 5000
db2 list applications
db2 list applications show detail
db2 list applications for database sample show detail
重點欄位:Application Name (db2bp=CLP, java=CC/自訂)、Application ID (LOCAL+用戶+時間 或 16進位IP+用戶+時間),快速識別阻塞源頭。
db2 update monitor switches using LOCK ON STATEMENT ON
# 視需求可加 TABLE, UOW, BUFFERPOOL, SORT
| 命令 | 用途 |
|---|---|
db2 get snapshot for locks on sample | 全庫鎖快照:持有者、請求者、模式、物件、等待時間 |
db2 get snapshot for locks on sample for application agentid <appl_id> | 單應用鎖詳情 |
db2 get snapshot for dynamic sql on sample | 動態 SQL 文本、執行統計、鎖關聯 |
db2 get snapshot for applications on sample | 應用層級:UOW、鎖等待、死結計數 |
快照為即時切片,事件監視器記錄完整生命週期,適合事後根因分析。
-- 建立監視死結與語句事件
CREATE EVENT MONITOR evm_lock FOR DEADLOCKS, STATEMENTS
WRITE TO FILE 'C:\db2events\lock_evt';
-- 啟用
SET EVENT MONITOR evm_lock STATE 1;
DEADLOCKS:僅記錄死結發生時的受害者/倖存者鎖圖。DEADLOCKS WITH DETAILS:包含完整 SQL 文本、鎖屬性 (較大)。STATEMENTS:記錄每條 SQL 執行起訖、耗時、鎖等待。
db2evmon -path 'C:\db2events\lock_evt' > lock_report.txt
報告將顯示死結循環鏈、受害者選擇依據 (通常回滾成本最低)、完整 SQL 文本與執行計畫片段。
SQL0911N (死結/逾時) 或回應變慢。LOCKTIMEOUT 是否合理、DLCHKTIME < LOCKTIMEOUT。get snapshot for locks 找出阻塞鏈頭 (持有鎖最久、無等待者)。agentid 查 dynamic sql 快照,定位具體陳述式。