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

DB2 隔離級別詳解:可重複讀——最高一致性的代價

     編輯:DB2 教學

定義與核心保證

Repeatable Read (RR) 是 DB2 最嚴格的隔離級別。它鎖定應用程式在工作單元中**引用的所有行**(不僅是檢索到的行),確保:

  • 同一工作單元內重複執行相同 SELECT,結果完全一致
  • **防止三大異常:** 髒讀、不可重複讀、幻像讀
  • 其他應用程式無法更新/刪除/插入任何可能影響結果集的行

鎖定機制深度解析

「引用」vs「檢索」的關鍵差異

掃描 10,000 行、謂詞過濾後僅 10 行符合條件:

  • RR: **鎖定全部 10,000 行**(掃描過程中引用的每一行)
  • RS/CS: 僅鎖定符合條件的 10 行

這是為了防止幻像讀:若允許其他交易在掃描範圍內插入新行,重新執行查詢時會出現「幻像行」。

鎖定模式

視存取路徑與謂詞,鎖定可為:Share (S)、Next Key Share (NS)、Update (U)、Exclusive (X)。

效能與併發代價

鎖定升級風險

大量行鎖可能超出 locklist / maxlocks 閾值,觸發**鎖定升級**為表級鎖(相當於隱性 LOCK TABLE)。優化器若預判升級風險高,可能直接選擇表級鎖進行索引掃描。

避免升級策略

  • 調大 locklist、maxlocks
  • 改用 Read Stability (RS) 隔離級別(僅鎖定符合條件行)
  • 優化查詢減少掃描範圍(加索引、分區裁剪)

特殊情境:RI 掃描隱性升級

評估參照完整性約束時,DB2 可能**內部將隔離級別升級為 RR** 掃描外部表,無論使用者設定為何。此舉增加死鎖/鎖等待風險。

對策: 為外鍵欄位建立索引,使 RI 掃描走索引而非全表掃描。

適用場景與選擇建議

場景建議隔離級別
金融帳務、庫存扣減等絕對一致性要求RR
高併發讀多寫少、可接受幻像讀RS 或 CS
大量資料報表、唯讀分析UR (Uncommitted Read)

總結

RR 提供最強一致性保證,但以**大量鎖定、低併發、高死鎖風險**為代價。非核心業務強一致性場景,**優先考慮 RS**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved