DB2 9.7 引入全新鎖事件監控器,整合死鎖、鎖逾時、鎖等待分析,取代舊版分散工具。本文透過建立範例資料庫、配置監控器、模擬並發場景、使用 db2evmonfmt 格式化輸出,示範如何快速定位鎖爭用根因。
db2sampl
db2 "UPDATE DB CFG FOR SAMPLE USING LOCKTIMEOUT 10"
db2 "CONNECT TO SAMPLE"
db2 "CREATE TABLESPACE TBSPACE_LOCKING"
db2 "CREATE EVENT MONITOR EVMON_LOCKING FOR LOCKING WRITE TO UNFORMATTED EVENT TABLE (TABLE EMDATA.TAB_LOCKING IN TBSPACE_LOCKING)"
db2 "SET EVENT MONITOR EVMON_LOCKING STATE 1"
AUTOSTART 預設啟用,STATE 1 立即啟動無需重啟資料庫。| 層級 | 配置方式 | 適用場景 |
|---|---|---|
| 資料庫級 | DB CFG 參數:MON_DEADLOCK、MON_TIMEOUT、MON_LOCKWAIT | 死鎖/逾時屬異常,建議全庫啟用;鎖等待普遍存在,可限定工作負載。 |
| 工作負載級 | ALTER WORKLOAD ... COLLECT LOCK [TIMEOUT|WAIT|DEADLOCK] DATA [WITH HISTORY] | 針對特定應用群組收集歷史 SQL(含導致鎖事件前的所有語句)。 |
db2 "ALTER WORKLOAD SYSDEFAULTUSERWORKLOAD COLLECT LOCK TIMEOUT DATA WITH HISTORY"
會話 1(持有 X 鎖不提交):
db2 "CONNECT TO SAMPLE"
db2 +c "UPDATE EMPLOYEE SET SALARY = SALARY * 1.02"
db2 +c "SELECT LASTNAME, FIRSTNME, SALARY FROM EMPLOYEE ORDER BY LASTNAME ASC"
會話 2(嘗試更新同表經理資料):
db2 "CONNECT TO SAMPLE"
db2 +c "UPDATE EMPLOYEE SET BONUS = SALARY * 0.1 WHERE JOB = 'MANAGER'"
10 秒後會話 2 報錯 SQL0911N reason code 68(鎖逾時)。
# 複製並編譯 db2evmonfmt 工具
copy "C:\Program Files\IBM\SQLLIB\samples\java\jdbc\db2evmonfmt.Java" .
copy "C:\Program Files\IBM\SQLLIB\samples\java\jdbc\DB2EvmonLocking.xsl" .
set PATH=C:\Program Files\IBM\SQLLIB\java\jdk\bin;%PATH%
javac db2evmonfmt.Java
# 格式化鎖逾時事件
java db2evmonfmt -d sample -ue emdata.tab_locking -ftext -u user -p pass > locktimeout.txt
UPDATE EMPLOYEE SET BONUS...)、鎖模式(請求 Update、持有 Exclusive)、等待時間。UPDATE EMPLOYEE SET SALARY... 及 SELECT...,隔離級 CS、鎖逾時 10 秒。db2 "ALTER WORKLOAD SYSDEFAULTUSERWORKLOAD COLLECT LOCK TIMEOUT DATA NONE"
db2 "CONNECT TO SAMPLE"
db2 "UPDATE DB CFG USING MON_DEADLOCK HISTORY IMMEDIATE"
MON_DEADLOCK 可線上修改(需 IMMEDIATE),預設 WITHOUT_HIST。
會話 1:
db2 "CONNECT TO SAMPLE"
db2 +c "UPDATE DEPARTMENT SET LOCATION = 'New York' WHERE DEPTNO = 'B01'"
會話 2:
db2 "CONNECT TO SAMPLE"
db2 +c "UPDATE DEPARTMENT SET DEPTNAME = 'OPERATIONS 1' WHERE DEPTNO = 'E11'"
db2 +c "UPDATE DEPARTMENT SET DEPTNAME = 'PLANNING 1' WHERE DEPTNO = 'B01'" -- 被會話1阻塞
會話 1 再執行:
db2 +c "UPDATE DEPARTMENT SET LOCATION = 'Los Angeles' WHERE DEPTNO = 'E11'" -- 形成死鎖循環
資料庫自動回滾一個交易,報錯 SQL0911N reason code 2。
java db2evmonfmt -d sample -ue emdata.tab_locking -type deadlock -ftext -u user -p pass > deadlock.txt
DEPARTMENT 表 B01、E11 列)。B01 再更新 E11;會話 2 先更新 E11 再更新 B01,經典交叉死鎖模式。db2 "SET EVENT MONITOR EVMON_LOCKING STATE 0"
db2 "DROP EVENT MONITOR EVMON_LOCKING"
db2 "DROP TABLE EMDATA.TAB_LOCKING"
DB2 9.7 鎖事件監控器提供統一、整合的並發問題診斷平台。配合 db2evmonfmt 工具,可將二進位事件轉為可讀報告,清晰呈現鎖屬性、參與者應用資訊、當前與歷史 SQL 陳述式。善用資料庫級(死鎖/逾時)與工作負載級(鎖等待/歷史)雙層級配置,能以最小負擔精準捕獲關鍵診斷資料,大幅縮短問題解決時間。