在 DB2 資料庫中,隔離級別是決定並發控制與鎖定策略的核心機制。它直接影響鎖的範圍、持有時間,進而左右系統的並發效能與資料一致性。本文將詳細解析 DB2 的四大隔離級別——RR(Repeatable Read)、RS(Read Stability)、CS(Cursor Stability)、UR(Uncommitted Read),並結合實際測試經驗,說明各級別的鎖定行為與適用場景。
DB2 提供四種隔離級別,由嚴格到寬鬆依序為:RR > RS > CS > UR。預設為 CS。選擇哪一級別,需在「資料一致性」與「並發吞吐量」間取得平衡。
事務讀取的所有掃描過的行皆加上共享鎖(S 鎖),直到事務提交或回滾才釋放。不僅鎖定符合條件的行,連帶不符合條件但被掃描到的行也會被鎖定。
查詢完成後,不滿足條件的行無法更新,亦無法插入新行。因為允許異動會破壞結果集穩定性。但若使用 SELECT ... FOR UPDATE WITH RR,仍可操作其他記錄,這屬特殊用法。
僅對符合條件的結果集行加上次級共享鎖(NS 鎖),直到事務結束。掃描過但不符合條件的行不加鎖。
查詢後,滿足條件的記錄被鎖定,不可更新;但可更新不滿足條件的記錄,也可插入新記錄。其他交易仍可讀取已鎖定記錄,但不可更新。
僅對游標當前指向的那一行加 NS 鎖;游標移動時,前一行鎖立即釋放。這是 DB2 預設隔離級別。
屬於極弱隔離,僅保證「正在處理的那一行」不被並發程式修改,適合高並發、可容忍短暫不一致的場景。
對唯讀操作完全不加行鎖。典型唯讀操作包含帶 ORDER BY 的 SELECT、宣告 FOR FETCH ONLY 的游標。
讀取完全無限制,但資料完整性無保障。僅適用於報表查詢、統計分析等可容忍髒讀的場合,能最大化並發效能。
無論採用何種隔離級別,修改操作(INSERT/UPDATE/DELETE)所影響的行皆加上排他鎖(X 鎖),並持有至事務提交或回滾。隔離級別主要影響讀取操作的鎖定策略。
| 隔離級別 | 鎖定範圍 | 防止髒讀 | 防止不可重複讀 | 防止幻影讀 | 並發度 | 典型應用 |
|---|---|---|---|---|---|---|
| RR | 全表掃描行 | 是 | 是 | 是 | 最低 | 嚴格財務核對、庫存扣款 |
| RS | 符合條件結果集 | 是 | 是 | 否 | 中 | 報表查詢、需穩定結果集 |
| CS(預設) | 游標當前行 | 是 | 否 | 否 | 高 | OLTP 高並發交易 |
| UR | 無鎖(唯讀) | 否 | 否 | 否 | 最高 | 數據倉庫、分析報表 |
實務上,建議:
• 核心交易採用 CS 或 RR(視一致性需求)
• 唯讀報表、大量掃描採用 UR
• 需結果集穩定但允許幻影讀時選 RS
• 善用 WITH RR/RS/CS/UR 子句在語句層級覆蓋預設值