生產環境 DB2 出現「單純 SELECT 陳述式頻繁死鎖」的詭異現象,且無法在測試環境重現。本文完整記錄 8 階段排查過程,最終鎖定 cur_commit 設定差異為根因,並給出索引解決方案。
SQL0911N (死鎖/逾時)。db2 get db cfg 輸出,聚焦含 LOCK 關鍵字的參數 → 多處不一致。cur_commit 浮現cur_commit (Currently Committed) 設定不同:OFF、測試 = ON。cur_commit=OFF 時,「交易 A 插入資料 → 交易 B 插入資料 → 交易 B 未提交前交易 A 查詢同表」會導致死鎖。db2 update db cfg using cur_commit OFF 並重啟實例。cur_commit 機制| 設定 | 行為 | 死鎖風險 |
|---|---|---|
cur_commit = ON (預設 9.7+) | 讀取者可存取「目前已提交」版本資料列,不等待未提交寫入鎖釋放 | 低 |
cur_commit = OFF | 讀取者遇到未提交寫入鎖會等待,若雙方互相等待 → 死鎖 | 高 |
生產環境為舊版升級而來,保留 OFF 設定;測試環境全新安裝預設 ON,導致行為差異。
cur_commit ON (次選):
db2 update db cfg using cur_commit ON
db2stop force; db2start
需評估相容性:舊應用若依賴「讀取等待未提交寫入」語意可能行為改變。
cur_commit=OFF 下,「讀寫」也會死鎖。這次排查耗時數週,核心教訓是「環境一致性」先於「程式碼分析」。建立參數基線、自動化環境驗證、善用 db2pd -locks 與 db2trc 進行即時診斷,才能在下次類似事件中快速定位根因。