DB2 V9.7 引入的 Currently Committed (CC) 語義 是游標穩定性 (CS) 隔離級別下的重大突破,徹底改變了讀寫並發的鎖競爭模型。本文深度解析 CC 的工作原理、鎖行為對比、啟用方式與實戰效能提升,助您在高吞吐量 OLTP 系統中釋放資料庫潛能。
| 先行工作負載 \ 後續工作負載 | 讀操作 | 寫操作 |
|---|---|---|
| 讀操作 | 不阻塞 | 不阻塞 |
| 寫操作 | 不阻塞 | 阻塞 |
| 先行工作負載 \ 後續工作負載 | 讀操作 | 寫操作 |
|---|---|---|
| 讀操作 | 不阻塞 | 可能阻塞 (FOR UPDATE 會阻塞) |
| 寫操作 | 必定阻塞 | 阻塞 |
核心問題:寫操作持有 X 鎖會阻塞後續所有讀操作,導致鎖等待、逾時甚至死鎖,嚴重限制高併發吞吐量。
| 先行工作負載 \ 後續工作負載 | 讀操作 | 寫操作 |
|---|---|---|
| 讀操作 | 不阻塞 | 不阻塞 |
| 寫操作 | 不阻塞 | 阻塞 |
突破性成果:達到與 Oracle Snapshot 相同的非阻塞讀取行為,唯寫寫衝突仍保持阻塞,確保資料一致性。
當掃描能確定獲取資料列或頁面的「已提交版本」時,完全跳過列級鎖獲取,直接讀取已提交資料。
| 資料列狀態 | 日誌位置 | CC 掃描行為 |
|---|---|---|
| 已提交修改/刪除 | 日誌緩衝區/作用中日誌/歸檔日誌 | 讀取首次修改前的已提交版本 |
| 未提交插入 | 作用中日誌 (標記為插入) | 直接忽略/跳過該列 |
| 無法確定是否已提交 | 索引/列狀態不明 | 退回傳統鎖定方式 |
列 1:刪除中 (X鎖) → 日誌在緩衝區 → 讀取刪除前版本 列 2:已提交插入 → 日誌已歸檔 → 正常可見 列 3:更新中 (X鎖) → 日誌在作用中日誌 → 讀取更新前版本 列 4:已提交插入 → 日誌已歸檔 → 正常可見 列 5:插入中 (X鎖) → 日誌在作用中日誌 → 直接跳過
-- 檢查目前設定
GET DATABASE CONFIGURATION FOR dbname | grep -i "cur_commit"
-- 啟用 CC (需重啟資料庫生效)
UPDATE DATABASE CONFIGURATION FOR dbname USING CUR_COMMIT ON;
DB2_SKIPDELETED、DB2_SKIPINSERTED 登錄變數可微調行為LOCK_WAITS、DEADLOCKS、LOG_READS 指標變化Currently Committed 語義是 DB2 邁向「無鎖讀取」的關鍵里程碑,將 CS 隔離級別的並發能力提升至接近 Snapshot 隔離級別,且無需應用程式修改即可透明受益。對於深受鎖競爭困擾的高吞吐系統,啟用 CC 往往是投入產出比最高的單一優化動作。