複雜 Web 環境下,DB2 for z/OS 出現死鎖,需快速定位導致死鎖的不良 SQL。本文演示如何配置 DB2 Performance Monitor (DB2PM) 採集 Locking 跟蹤 與 SQL Activity 跟蹤,並聯鎖分析與 SQL 關聯分析鎖定問題語句。
105 (DBID/OBID 轉換)、107 (資料集開關)、172 (Deadlock)TGUSER03.DB2PM.TRACE0116,20,53,58,59,60,61,63,64,65,66,68,69,70,71,88,89,105TGUSER03.DB2PM.TRACE02Web 應用常見頁鎖/行鎖(S/U/X 三模式)。死鎖經典模型:
JobOne 持有 表M 頁B X鎖 → 請求 表N 頁A X鎖 (被 JobTwo 持有) → 掛起 JobTwo 持有 表N 頁A X鎖 → 請求 表M 頁B X鎖 (被 JobOne 持有) → 掛起 → 循環等待 → 死鎖 → DB2 選擇 Victim 回滾
報告關鍵欄位:
WAITERS=2:兩個等待者(LUW 實例 0CC544053119、0E26A4053107)SW03DB1.USERS.X'00004E'.X'2B' X鎖 → 請求同表 X'00004C' S鎖SW03DB1.USERS.X'00004C'.X'2B' X鎖 → 請求同表 X'00004E' S鎖06:30:09.41044991BLOCKER is HOLDER --*VICTIM*:標識被選為犧牲者的線程對每個 LUW 實例:
SW03DB1.USERS) 的 SQL
-- 實例 0CC544053119
最新 COMMIT: 06:28:51.04
窗口: 06:28:51.04 ~ 06:30:09.41
發現: INSERT INTO USERS ... ; SELECT FROM USERS ... (無中間 COMMIT)
-- 實例 0E26A4053107
最新 COMMIT: 06:28:50.65
窗口: 06:28:50.65 ~ 06:30:09.41
發現: SELECT FROM USERS ... ; INSERT INTO USERS ... (無中間 COMMIT)
兩線程交叉執行 INSERT 與 SELECT,且 缺乏中間提交,導致表掃描鎖升級衝突,並發執行時形成死鎖。
COMMIT,減少鎖持有時間USERS 關鍵查詢欄位建立索引,避免表掃描CS 或 UR,減少 S 鎖請求此法讓開發與測試人員均能獨立完成「死鎖 → 壞 SQL → 優化」閉環,大幅縮短並發性能問題解決週期。