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

SQL-92 標準四大交易隔離級別與三種併發現象完整解析

     編輯:關於SqlServer

三種併發現象 (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 欄位
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved