三種併發現象 (Phenomena)
| 現象 | 說明 | 範例時序 |
| 髒讀 | 讀到其他交易**未提交**的修改 | T1: Write → Rollback; T2: Read (讀到 T1 寫入值) |
| 不可重複讀 | 同一交易前後兩次讀取同一資料,**值不同** (被其他交易修改/刪除) | T1: Read → T2: Write/Delete → Commit → T1: Read (值變了) |
| 幻影讀 | 同一交易前後兩次依相同條件查詢,**列數不同** (被其他交易新增/刪除符合條件的列) | T1: Select → T2: Insert/Delete (符合條件) → Commit → T1: Select (列數變了) |
SQL-92 四大隔離級別定義矩陣
| 隔離級別 | 髒讀 (P1) | 不可重複讀 (P2) | 幻影讀 (P3) |
| Read Uncommitted (讀未提交) | 允許 | 允許 | 允許 |
| Read Committed (讀已提交) | 禁止 | 允許 | 允許 |
| Repeatable Read (可重複讀) | 禁止 | 禁止 | 允許 |
| Serializable (可序列化) | 禁止 | 禁止 | 禁止 |
SQL Server 實作差異
- 預設隔離級別:**Read Committed**。
- SQL Server 透過**鎖定**實作 Read Committed / Repeatable Read / Serializable。
- **Snapshot Isolation (快照隔離)** / **Read Committed Snapshot (RCSI)** 使用**版本存儲** (row versioning) 實作語句/交易級別的一致性讀取,**不阻塞寫入**,是高併發系統常用選擇。
- 啟用 RCSI:
ALTER DATABASE db SET READ_COMMITTED_SNAPSHOT ON;
隔離級別設定語法
-- 交易層級
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 或 REPEATABLE READ / SERIALIZABLE / SNAPSHOT
BEGIN TRAN; ... COMMIT;
-- 查詢層級 (僅限 SELECT)
SELECT * FROM t WITH (NOLOCK); -- 相當於 READ UNCOMMITTED
SELECT * FROM t WITH (READCOMMITTED); -- 明確指定
SELECT * FROM t WITH (REPEATABLEREAD);
SELECT * FROM t WITH (SERIALIZABLE);
選型建議
- 高併發 OLTP:預設 Read Committed + RCSI (最小阻塞、語句級一致性)。
- 報表/分析查詢:Snapshot 隔離 (交易級一致性視圖,不阻塞寫入)。
- 嚴格財務計算:Serializable (最高隔離,但併發度最低,慎用)。
- 避免長時間持有 Serializable 鎖,易導致死結與逾時。
驗證當前隔離級別
DBCC USEROPTIONS; -- 顯示 isolation level 欄位