傳統悲觀鎖(RR/RS/CS 隔離級別)透過加鎖保證一致性,但在高併發、長事務、數據共享環境下易產生鎖升級、死鎖、鎖等待鏈,嚴重拖垮吞吐量。DB2 9 for z/OS 引入**樂觀鎖**機制:讀取時不加鎖,更新時通過「行變更時間戳 + RID」驗證衝突,將鎖開銷降至最低。
CREATE TABLE BEULKE.PRODUCT_TBL (
PROD_NBR INTEGER NOT NULL,
PROD_INVENTORY INTEGER NOT NULL,
PROD_LAST_UPD TIMESTAMP NOT NULL
GENERATED ALWAYS
FOR EACH ROW ON UPDATE
AS ROW CHANGE TIMESTAMP
);
關鍵字解析:
GENERATED ALWAYS:系統強制生成,用戶不可显式插入/更新。FOR EACH ROW ON UPDATE:每次 UPDATE 自動刷新。AS ROW CHANGE TIMESTAMP:標識此列為「行變更時間戳」,DB2 內部維護精確到微秒的修改時間 + 隱含 RID。-- 1. 讀取時帶出時間戳
SELECT PROD_NBR, PROD_INVENTORY, PROD_LAST_UPD
FROM PRODUCT_TBL
WHERE PROD_NBR = 1001;
-- 2. 業務邏輯處理...
-- 3. 更新時帶入舊時間戳作為樂觀鎖條件
UPDATE PRODUCT_TBL
SET PROD_INVENTORY = PROD_INVENTORY - 5
WHERE PROD_NBR = 1001
AND PROD_LAST_UPD = '2024-05-18-10.30.45.123456'; -- 客戶端保存的舊值
-- 4. 檢查 SQLERRD(3) / ROW_COUNT
-- 0 行受影響 → 並發衝突,需重讀重試
優勢:整個事務無需持有行鎖,隔離級別可降為 UR (Uncommitted Read),極大減少鎖爭用。
SELECT * FROM ORDERS
WHERE STATUS = 'PENDING'
SKIP LOCKED DATA;
SELECT、UPDATE、DELETE。| 維度 | 悲觀鎖 (RR/RS/CS) | 樂觀鎖 (UR + ROW CHANGE TIMESTAMP) |
|---|---|---|
| 鎖開銷 | 高(S/X 鎖、鎖升級、死鎖檢測) | 極低(讀無鎖,更新瞬間短鎖) |
| 衝突檢測 | 阻塞等待 | 更新失敗重試(應用層處理) |
| 適用場景 | 高衝突、短事務、強一致性要求 | 低衝突、長思考時間、高併發讀多寫少 |
| 應用改造 | 無(透明) | 需增加版本檢查與重試邏輯 |
| 數據一致性 | 強一致 | 最終一致(重試成功前可能讀到舊值) |
ROW CHANGE TIMESTAMP 列(ALTER TABLE ADD COLUMN ...)。WITH UR;更新操作保持 CS 但依賴時間戳條件。OPTIMISTIC_UPDATE_FAILURES、LOCK_WAITS、DEADLOCKS 趨勢對比。DB2 9 for z/OS 的樂觀鎖特性通過 ROW CHANGE TIMESTAMP + UR 隔離 + SKIP LOCKED DATA 組合拳,為高併發 OLTP 與混合負載提供了「低鎖、高吞吐」的新選擇。關鍵在於應用層配合重試邏輯,將衝突從「阻塞等待」轉為「快速失敗重試」,在數據共享環境中效果尤為顯著。