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

DB2 隔離級別與效能深度解析:RR、RS、CS、UR 選擇指南

     編輯:DB2 教學

前言

隔離級別決定交易存取資料時的鎖定行為,直接影響並發效能與資料一致性。DB2 提供四種標準隔離級別,由嚴格到寬鬆依序為:可重複讀、讀穩定性、游標穩定性、未認可讀。本文詳細說明各級別的鎖定機制、幻像讀/不可重複讀特性、效能影響與選型建議。

四大隔離級別詳細比較

1. 可重複讀 - 最嚴格

鎖定範圍: 鎖定工作單元中「參考到的所有列」,包含掃描過但不符合條件的列(如掃描 10,000 列只取 10 列,仍鎖定 10,000 列)。

防止現象: 髒讀、不可重複讀、幻像讀皆不可能發生。

特性:

  • 同一工作單元內重複執行相同 SELECT,結果完全一致。
  • 其他交易無法更新、刪除、插入任何可能影響結果集的列。
  • 無法讀取其他交易的未認可變更。

效能代價: 鎖定量大,易觸發鎖定升級為表級鎖定,導致並發度大幅下降。若 locklist/maxlocks 設定不足,優化器可能直接選擇表鎖。

適用場景: 極高一致性需求、只讀報表、資料量小的關鍵交易。

2. 讀穩定性 - 折衷選擇

鎖定範圍: 僅鎖定「實際擷取/符合條件的列」(上例僅鎖定 10 列)。

防止現象: 髒讀、不可重複讀不可能;幻像讀可能發生(重新執行查詢可能看到新增的符合條件列)。

特性:

  • 保證已讀取的列在交易結束前不被他人修改/刪除。
  • 優化器不會主動升級為表鎖,並發度優於 RR。
  • 確保返回資料在應用程式看到前保持穩定(即使使用暫存表/分頁)。

適用場景: 並發環境、需資料穩定但不重複執行同一查詢、讀寫交易。

3. 游標穩定性 - 預設級別

鎖定範圍: 僅鎖定「游標當前定位的那一列」;移開游標即釋放鎖定(除非該列已被更新,則持有至交易結束)。

防止現象: 髒讀不可能;不可重複讀、幻像讀皆可能發生。

特性:

  • 最大並發度,最小鎖定開銷。
  • 其他交易無法更新/刪除游標當前列。
  • 無法讀取他人未認可變更。
  • 模糊游標可能被 BLOCKING 選項隱性升級為 CS。

適用場景: 高並發 OLTP、瀏覽式查詢、可接受不可重複讀的業務。

4. 未認可讀 - 最寬鬆

鎖定範圍: 唯讀游標幾乎不加鎖(除非他人嘗試 DROP/ALTER 物件);可更新游標實際以 CS 級別運作。

防止現象: 髒讀、不可重複讀、幻像讀皆可能發生。

特性:

  • 可讀取他人未 COMMIT 的資料(髒讀)。
  • 不阻塞他人讀寫,也不被他人阻塞(除 DDL)。
  • 效能最佳,並發度最高。
  • 若使用 FOR READ ONLY 或預編譯 BLOCKING ALL + STATICREADONLY YES,可確保維持 UR 級別。

適用場景: 只讀報表、臨時查詢、不介意髒讀的統計分析、資料倉儲抽取。

隔離級別特性總覽表

隔離級別髒讀不可重複讀幻像讀並發度鎖定開銷
可重複讀 (RR)不可能不可能不可能最低最高
讀穩定性 (RS)不可能不可能可能中中高
游標穩定性 (CS)不可能可能可能高低
未認可讀 (UR)可能可能可能最高最低

選型決策指南

應用程式類型需高資料穩定性不需高資料穩定性
讀寫交易RSCS (預設)
唯讀交易RR 或 RSUR

進階注意事項

  • 參考完整性掃描: DB2 內部評估 RI 约束時可能隱性升級為 RR,造成死鎖風險。建議在外鍵欄位建立索引以避免全表掃描。
  • 鎖定升級: RR 級別易觸發;調大 locklist、maxlocks 或改用 RS 可緩解。
  • WITH HOLD 游標: 跨交易保持游標開啟時,隔離級別在 OPEN CURSOR 時確定,之後不再變更。
  • 死鎖風險: 隔離級別越高,持鎖越久,死鎖機率越大;需配合索引設計與交易長度控制。

總結

沒有「最好」的隔離級別,只有「最適合」的選擇。原則:在滿足業務一致性需求的前提下,選擇並發度最高(鎖定最少)的級別。大多數 OLTP 系統以 CS 為預設,報表查詢用 UR,關鍵財務核對用 RS/RR,並針對熱點表建立適當索引以降低鎖定衝突。

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