隔離級別決定交易存取資料時的鎖定行為,直接影響並發效能與資料一致性。DB2 提供四種標準隔離級別,由嚴格到寬鬆依序為:可重複讀、讀穩定性、游標穩定性、未認可讀。本文詳細說明各級別的鎖定機制、幻像讀/不可重複讀特性、效能影響與選型建議。
鎖定範圍: 鎖定工作單元中「參考到的所有列」,包含掃描過但不符合條件的列(如掃描 10,000 列只取 10 列,仍鎖定 10,000 列)。
防止現象: 髒讀、不可重複讀、幻像讀皆不可能發生。
特性:
效能代價: 鎖定量大,易觸發鎖定升級為表級鎖定,導致並發度大幅下降。若 locklist/maxlocks 設定不足,優化器可能直接選擇表鎖。
適用場景: 極高一致性需求、只讀報表、資料量小的關鍵交易。
鎖定範圍: 僅鎖定「實際擷取/符合條件的列」(上例僅鎖定 10 列)。
防止現象: 髒讀、不可重複讀不可能;幻像讀可能發生(重新執行查詢可能看到新增的符合條件列)。
特性:
適用場景: 並發環境、需資料穩定但不重複執行同一查詢、讀寫交易。
鎖定範圍: 僅鎖定「游標當前定位的那一列」;移開游標即釋放鎖定(除非該列已被更新,則持有至交易結束)。
防止現象: 髒讀不可能;不可重複讀、幻像讀皆可能發生。
特性:
適用場景: 高並發 OLTP、瀏覽式查詢、可接受不可重複讀的業務。
鎖定範圍: 唯讀游標幾乎不加鎖(除非他人嘗試 DROP/ALTER 物件);可更新游標實際以 CS 級別運作。
防止現象: 髒讀、不可重複讀、幻像讀皆可能發生。
特性:
FOR READ ONLY 或預編譯 BLOCKING ALL + STATICREADONLY YES,可確保維持 UR 級別。適用場景: 只讀報表、臨時查詢、不介意髒讀的統計分析、資料倉儲抽取。
| 隔離級別 | 髒讀 | 不可重複讀 | 幻像讀 | 並發度 | 鎖定開銷 |
|---|---|---|---|---|---|
| 可重複讀 (RR) | 不可能 | 不可能 | 不可能 | 最低 | 最高 |
| 讀穩定性 (RS) | 不可能 | 不可能 | 可能 | 中 | 中高 |
| 游標穩定性 (CS) | 不可能 | 可能 | 可能 | 高 | 低 |
| 未認可讀 (UR) | 可能 | 可能 | 可能 | 最高 | 最低 |
| 應用程式類型 | 需高資料穩定性 | 不需高資料穩定性 |
|---|---|---|
| 讀寫交易 | RS | CS (預設) |
| 唯讀交易 | RR 或 RS | UR |
locklist、maxlocks 或改用 RS 可緩解。沒有「最好」的隔離級別,只有「最適合」的選擇。原則:在滿足業務一致性需求的前提下,選擇並發度最高(鎖定最少)的級別。大多數 OLTP 系統以 CS 為預設,報表查詢用 UR,關鍵財務核對用 RS/RR,並針對熱點表建立適當索引以降低鎖定衝突。