首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 for Linux, UNIX, and Windows 鎖事件監控器實戰:解決並發問題

     編輯:DB2 教學

前言

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

關鍵輸出解讀

  • Event Type: LOCKTIMEOUT、時間戳、偵測分區。
  • 參與者 1(請求鎖):應用程式控制代碼、認證 ID、SQL 陳述式(UPDATE EMPLOYEE SET BONUS...)、鎖模式(請求 Update、持有 Exclusive)、等待時間。
  • 參與者 2(持有鎖):歷史活動顯示先前執行的 UPDATE EMPLOYEE SET SALARY... 及 SELECT...,隔離級 CS、鎖逾時 10 秒。
  • WITH HISTORY 關鍵:捕獲阻塞交易內「所有先前 SQL」,揭露真正持有鎖的語句(本例中為第一個 UPDATE,而非 SELECT)。

停止收集

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

關鍵輸出解讀

  • Deadlock Graph:參與者數量、被犧牲者、死鎖類型(local)。
  • 兩參與者互相請求對方持有的行級排他鎖(DEPARTMENT 表 B01、E11 列)。
  • 完整歷史 SQL:會話 1 先更新 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 陳述式。善用資料庫級(死鎖/逾時)與工作負載級(鎖等待/歷史)雙層級配置,能以最小負擔精準捕獲關鍵診斷資料,大幅縮短問題解決時間。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved