| 類型 | 成因 | 屬性 | 對策方向 |
|---|---|---|---|
| 死鎖 | 雙向資源搶佔,程式邏輯缺陷 | 程式錯誤 | 調整存取順序、縮短事務、降低隔離級別 |
| 鎖等待 | 資源爭用,正常並發現象 | 效能問題 | SQL 調優、索引優化、調整鎖超時參數 |
DLCHKTIME 與 LOCKTIMEOUTdb2 get db cfg | grep -E "DLCHKTIME|LOCKTIMEOUT"
db2 update db cfg using LOCKTIMEOUT 30 # 建議 10-60 秒,-1 表無限等待(生產禁用)
db2 update db cfg using DLCHKTIME 5000 # 死鎖檢查間隔(ms),宜小於 LOCKTIMEOUT
原則:DLCHKTIME (ms) < LOCKTIMEOUT (s) × 1000,確保死鎖優先被檢測而非等待超時。
db2 list applications show detail
# 關鍵欄位:
# Application Name: db2bp=CLP, java=CC/Java應用
# Application Id: LOCAL.用戶.時間 / 16進制IP.用戶.時間
用途:識別測試環境殘留連線、確認生產並發模式、鎖定問題應用來源。
db2 get monitor switches
db2 update monitor switches using LOCK ON STATEMENT ON
# 建議同開:BUFFERPOOL, SORT, TABLE, UOW, TIMESTAMP
| 層級 | 指令 | 典型用途 |
|---|---|---|
| 資料庫管理器 | db2 get snapshot for dbm | 整體資源、配置、代理狀態 |
| 資料庫 | db2 get snapshot for database on <db> | 緩衝池命中、鎖升級、日誌、排序 |
| 應用/代理 | db2 get snapshot for application agentid <id> | 特定應用鎖等待鏈、執行 SQL、狀態 |
| 表/表空間 | db2 get snapshot for tables on <db> | 表掃描、鎖模式、資料列讀寫統計 |
| 鎖詳細 | db2 get snapshot for locks on <db> [for application agentid <id>] | 鎖持有者/請求者、模式、物件、等待時間 |
db2 get snapshot for dynamic sql on <db>
# 輸出含:執行次數、總/平均耗時、排序/列存取、語句文本
DEADLOCKS:死鎖摘要DEADLOCKS WITH DETAILS:含完整 SQL、鎖鏈、隔離級別STATEMENTS:語句執行歷史(耗時、返回行、存取計劃)-- 建立(寫入檔案,目錄需 DB2 實例擁有者寫權限)
CREATE EVENT MONITOR mylock FOR DEADLOCKS WITH DETAILS, STATEMENTS
WRITE TO FILE '/home/db2inst1/evmon/lcks';
-- 啟用
SET EVENT MONITOR mylock STATE 1;
-- 讀取報告(斷開連線後自動寫入)
db2evmon -path '/home/db2inst1/evmon/lcks' > deadlock_report.txt
LOCKTIMEOUT ≠ -1,DLCHKTIME 合理LIST APPLICATIONS 確認並發來源LOCK/STATEMENT 監視器LOCKS 快照 + DYNAMIC SQL 快照DEADLOCKS WITH DETAILS + STATEMENTS)DB2 UDB Performance Tuning