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

SQL-92 四大隔離等級原理與測試腳本

     編輯:關於SqlServer

SQL Server 支援 SQL-92 標準四種隔離等級,由低到高:

隔離等級髒讀不可重複讀幻讀說明
READ UNCOMMITTED可能可能可能讀取未認可資料,效能最好,僅限唯讀報表。
READ COMMITTED防止可能可能預設等級,僅讀取已認可資料;陳述式間資料可能變更。
REPEATABLE READ防止防止可能鎖定讀取範圍至交易結束;新增列仍可能產生幻讀。
SERIALIZABLE防止防止防止範圍鎖鎖定整個查詢範圍,並發度最低,一致性最高。

測試環境建立

CREATE TABLE t_emp (
  id NUMERIC(10),
  name VARCHAR(10),
  salary NUMERIC(10,2)
);
INSERT INTO t_emp VALUES (1,'jack',10000.50),(2,'jack2',8000.50),(3,'jack3',120000),(4,'jack4',5000),(5,'jack5',3000);

髒讀測試 (READ UNCOMMITTED)

-- Session 1
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRAN;
SELECT * FROM t_emp WHERE id = 1; -- 讀到 Session 2 未認可的修改
-- Session 2
BEGIN TRAN;
UPDATE t_emp SET salary = 9999 WHERE id = 1;
-- 未 COMMIT,Session 1 已讀到 9999 (髒讀)
ROLLBACK; -- Session 1 讀到的資料實際不存在

設定隔離等級語法

SET TRANSACTION ISOLATION LEVEL READ COMMITTED | REPEATABLE READ | SERIALIZABLE | READ UNCOMMITTED;
-- 或資料庫層級預設
ALTER DATABASE YourDB SET READ_COMMITTED_SNAPSHOT ON; -- 啟用 RCSI (行版本控制)

建議

  • OLTP 交易預設 READ COMMITTED;長報表可用 READ UNCOMMITTED 或啟用 READ_COMMITTED_SNAPSHOT (RCSI) 避免封鎖。
  • SERIALIZABLE 僅用於極嚴格一致性需求 (如財務結帳),並發度極低。
  • SQL Server 2005+ 提供 SNAPSHOT 隔離 (行版本),讀不阻寫、寫不阻讀,需啟用 ALLOW_SNAPSHOT_ISOLATION。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved