SQL Server 提供豐富的 查詢提示 控制 SELECT 鎖定行為,覆寫交易隔離層級設定。本文系統整理六大鎖定提示的功能、行為差異與適用場景。
| 提示 | 中文名 | 鎖類型 | 持有期間 | 並發影響 | 典型場景 |
|---|---|---|---|---|---|
NOLOCK | 不加鎖 / 髒讀 | 無共享鎖 | 即時釋放 | 讀取未提交資料 (髒讀)、可能重複/遺漏列 | 報表查詢、可容忍髒讀的大表掃描 |
HOLDLOCK | 保持鎖 | 共享鎖 (S) | 交易結束 | 防止幻讀,等同 SERIALIZABLE 範圍 | 需可重複讀取 + 幻讀保護的交易 |
UPDLOCK | 更新鎖 | 更新鎖 (U) | 交易/陳述式結束 | 允許並發讀取 (S 相容),阻塞其他 U/X 鎖 | 讀取後稍後更新,避免死結 |
TABLOCK | 表鎖 (共享) | 表級共享鎖 (S) | 陳述式結束 | 阻塞所有寫入,允許並發讀取 | 大量載入、全表掃描需一致性快照 |
PAGLOCK | 頁鎖 (預設) | 頁級共享鎖 (S) | 陳述式結束 | 預設行為,粒度介於列/表之間 | 一般查詢無需指定 |
TABLOCKX | 排他表鎖 | 表級排他鎖 (X) | 交易/陳述式結束 | 完全獨佔,阻塞所有讀寫 | 大量刪除/截斷、DDL 維護窗口 |
SELECT * FROM Orders WITH (NOLOCK) WHERE ...
SELECT * FROM Orders WITH (UPDLOCK, HOLDLOCK) WHERE ...
-- 多提示以逗號分隔,括號可省略單一提示
NOLOCK,但需文件化風險。UPDLOCK,配合 HOLDLOCK 可達 SERIALIZABLE 效果。TABLOCKX / TABLOCK 減少鎖升級開銷。六大鎖定提示對應不同並發/一致性取捨。**核心口訣:查詢用 NOLOCK(慎)、查改用 UPDLOCK、大批次用 TABLOCK(X)、嚴格一致用 HOLDLOCK**。實務中請依業務容忍度與並發壓力精準選擇。