DB2 9.5 引入 鎖超時報告 與 死鎖事件監視器 (DETAILS HISTORY),徹底解決舊版 db2cos + db2pd 僅能捕獲鎖持有者「最後一條語句」的盲區——最後一條語句往往只是查詢,真正持有衝突鎖的 UPDATE/DELETE 早已執行完畢隱藏在事務歷史中。
報告分三大塊:請求者、鎖信息、持有者。重點字段:
| 字段 | 含義 | 排查價值 |
|---|---|---|
| Lock Name | 十六進制鎖標識 | 關聯表空間/表/行,定位具體資源 |
| Lock Type | Row / Table / ... | 判斷鎖粒度,指導索引/隔離級優化 |
| Lock Mode Requested | ..U (Update) / ..X (Exclusive) | 請求者想加什麼鎖 |
| Lock Mode Held | ..X (Exclusive) | 持有者實際持有什麼鎖 |
| Statement (Requester) | 當前執行的 SQL | 直接看到被阻塞的語句 |
| List of Inactive SQL Statements (Holder) | 持有者事務內已執行完成的所有 SQL | 核心突破:揭示真正加鎖語句 |
UPDATE EMPLOYEE SET BONUS = SALARY * 0.1 WHERE JOB = 'MANAGER' 申請 U 鎖超時。SELECT LASTNAME, FIRSTNME, SALARY FROM EMPLOYEE ORDER BY LASTNAME — 查詢不加 X 鎖,誤導排查方向。List of Inactive SQL Statements 顯示持有者事務歷史:#1 SELECT ... (查詢)#2 UPDATE EMPLOYEE SET SALARY = SALARY * 1.02 ← 真兇:全表更新加持 X 鎖未提交DB2_CAPTURE_LOCKTIMEOUT=ON (實例級,動態生效) — 開啟基礎報告,開銷極低。CREATE EVENT MONITOR ... FOR DEADLOCKS WITH DETAILS HISTORY — 記錄完整事務 SQL 歷史,顯著增加監視器堆佔用,僅在疑難案例臨時啟用。DIAGPATH,DB2 不自動清理,DBA 需定期歸檔/刪除,防止文件系統爆滿。SYSCAT.STATEMENTS。db2pdcfg -catch locktimeout 獲取堆棧。DB2_CAPTURE_LOCKTIMEOUT=ON 常開。DIAGPATH/*.locktimeout 文件,定位請求者/持有者/鎖資源/關鍵 SQL。DETAILS HISTORY 事件監視器,復現後即關閉。DB2 9.5 的鎖超時報告 + 語句歷史功能,將鎖爭用排查從「盲人摸象」推進到「全景可視」。核心價值在於還原持有者的完整事務上下文,讓 DBA 能精準定位「那條早已執行完的 UPDATE」—— 這正是解鎖生產環境疑難鎖超時的金鑰匙。