在高並發 OLTP 系統中,鎖衝突是效能瓶頸的主要來源。DB2 提供三種互補的策略來提升並發度,本文透過實例說明各策略的適用場景與配置方式。
使用 WITH UR(Uncommitted Read)子句,讓 SELECT 語句讀取未提交資料,完全不獲取共享鎖:
SELECT * FROM orders WHERE cust_id = 100 WITH UR;
透過 Registry 變數改變 DB2 評估謂詞與鎖的順序:
db2set DB2_EVALUNCOMMITTED=ON -- 先做謂詞檢查,再加鎖,縮短鎖持有時間
db2set DB2_SKIPINSERTED=ON -- 跳過未提交的 INSERT 記錄(SELECT/UPDATE 不見該列)
db2set DB2_SKIPDELETED=ON -- 跳過未提交的 DELETE 記錄(不等待提交,視同已刪除)
生效方式: 設定後需重啟實例(db2stop; db2start)。
| 參數 | 核心機制 | 適用場景 |
|---|---|---|
| DB2_EVALUNCOMMITTED | 先評估 WHERE 條件,不滿足則不加鎖 | 高並發更新/查詢混合負載 |
| DB2_SKIPINSERTED | 忽略未提交的新增列 | 大量並發插入、讀取舊數據為主 |
| DB2_SKIPDELETED | 視未提交刪除為已刪除,不等待 | 大量並發刪除、需快速掃描 |
精準索引讓 DB2 僅鎖定符合條件的少量列,而非掃描全表加鎖:
CREATE INDEX idx_orders_cust_status ON orders(cust_id, status);
-- 查詢 WHERE cust_id = ? AND status = 'OPEN' 僅鎖定極少數列
WITH URLOCKLIST、MAXLOCKS、鎖等待時間指標驗證優化成效