首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 隔離層級完整解析:RS、RR、CS、UR 鎖行為與實測差異

     編輯:DB2 教學

四大隔離層級對照

層級縮寫讀取鎖類型持有期間幻影列並發度
Read StabilityRSNS (Next-key Share)事務結束可能出現中
Repeatable ReadRRS (Share)事務結束不出現低
Cursor StabilityCSNS (僅游標當前列)游標移動釋放可能出現高(預設)
Uncommitted ReadUR無鎖(唯讀查詢)無大量出現最高

詳細行為與實測筆記

RS (Read Stability)

  • 掃描階段:僅對**符合條件**的列加 NS 鎖,不符合條件的列**不加鎖**。
  • 事務內重複讀取同列 → 值不變。
  • 但 `INSERT` 新列或 `UPDATE` 使不符合列變為符合 → 重開游標會看到**幻影列**。
  • 實測:可更新不符合條件列、可插入新列;其他 Session 可讀已鎖定列,不可更新。

RR (Repeatable Read)

  • 掃描階段:對**所有被掃描列**(含不符合條件)加 S 鎖。
  • 事務內重開游標 → 結果集完全不變(含列數、順序)。
  • 鎖範圍最大,並發度最低。
  • 實測:不可更新任何被掃描列、不可插入新列(會阻塞);`SELECT ... FOR UPDATE WITH RR` 可縮小鎖範圍至實際取得列。

CS (Cursor Stability) — 預設

  • 僅鎖定**游標當前指向的那一列**(NS 鎖),游標移開即釋放。
  • 高並發,但同一事務兩次讀取同列可能值不同(若被他 Session 更新)。
  • 適合:逐列處理、游標迴圈、高併發 OLTP。

UR (Uncommitted Read)

  • **完全不加列鎖**;讀取未提交資料(髒讀)。
  • 限用於:`SELECT ... FOR FETCH ONLY`、含 `ORDER BY`/`GROUP BY` 等唯讀查詢。
  • 效能最佳、並發最高,但資料一致性無保障。
  • 實測:可讀取他 Session 未提交的 INSERT/UPDATE/DELETE 結果。

修改操作統一規則

**INSERT/UPDATE/DELETE** 所修改列 → **X 鎖**,持有至事務結束,**與隔離層級無關**。

應用指引

  • 財務核心交易:`RR` 或 `RS` + `SELECT FOR UPDATE`
  • 一般 OLTP:`CS`(預設)
  • 報表/分析/日誌查詢:`UR`(`WITH UR` 子句)
  • 長時間批次:考慮 `RS` 減少鎖衝突,或拆分小批次用 `CS`

指定方式

-- 陳述式級
SELECT * FROM T WITH RR;

-- 會話級 (CLI/JDBC/ODBC)
SET CURRENT ISOLATION = RR;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved