事務期間表被鎖,SELECT 被阻塞,業務允許讀到未提交資料 (髒讀) 或跳過被鎖行。
SELECT * FROM dbo.Orders WITH (NOLOCK) WHERE Status = 1;
-- 等價於
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM dbo.Orders WHERE Status = 1;
SELECT * FROM dbo.Orders WITH (READPAST) WHERE Status = 1;
ALTER DATABASE MyDB SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON;
-- 連線層級
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
SELECT * FROM dbo.Orders; -- 讀取事務開始時的版本,不阻塞寫入
| 場景 | 推薦 |
|---|---|
| 報表/BI | NOLOCK |
| 任務佇列搶單 | READPAST + UPDLOCK, ROWLOCK |
| 高併發核心業務 | READ_COMMITTED_SNAPSHOT (RCSI) |
| 嚴格一致性要求 | 預設 READ COMMITTED (接受阻塞) |