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

SQL Server 查詢提示鎖定提示完全指南:NOLOCK、HOLDLOCK、UPDLOCK、XLOCK 差異與適用場景

     編輯:關於SqlServer

核心結論

WITH (NOLOCK) 不僅自身不加鎖,也不會被現有鎖阻擋,可直接讀取被鎖定的資料列 (髒讀)。

四大鎖定提示對比表

提示鎖類型行為特性適用場景限制
NOLOCK無鎖 (READUNCOMMITTED)不加鎖、不被鎖阻擋、髒讀報表查詢、近似統計、唯讀分析僅限 SELECT
HOLDLOCK保持鎖 (SERIALIZABLE 等價)持有共享鎖至交易結束、防止幻讀需交易一致性的 SELECTSELECT/UPDATE/DELETE 皆可
UPDLOCK更新鎖讀取時加更新鎖、防止死鎖、允許其他共享鎖「查詢後更新」模式SELECT/UPDATE/DELETE 皆可
XLOCK排他鎖讀取時加排他鎖、完全阻擋其他存取需獨佔資料的修改前查詢SELECT/UPDATE/DELETE 皆可

關鍵限制:NOLOCK 僅限 SELECT

-- 錯誤示範
UPDATE dbo.test WITH (NOLOCK) SET username = 'wokofo';
-- 錯誤訊息:INSERT、UPDATE、DELETE 或 MERGE 語句的目標表不允許使用 NOLOCK 和 READUNCOMMITTED 鎖提示。

實際應用範例

-- 唯讀報表:髒讀可接受,極致效能
SELECT TOP 10 * FROM dbo.test WITH (NOLOCK);

-- 需一致性快照:防止幻讀
SELECT TOP 10 * FROM dbo.test WITH (HOLDLOCK);

-- 查詢後立即更新:防止死鎖
SELECT TOP 10 * FROM dbo.test WITH (UPDLOCK);
UPDATE dbo.test WITH (UPDLOCK) SET username = 'wokofo' WHERE id = 1;

-- 獨佔存取:維護窗口操作
SELECT TOP 10 * FROM dbo.test WITH (XLOCK);
UPDATE dbo.test WITH (XLOCK) SET username = 'wokofo' WHERE id = 1;

進階:鎖定提示組合與擴充

  • READPAST - 跳過被鎖定的資料列 (佇列處理常用)
  • ROWLOCK/PAGLOCK/TABLOCK - 強制鎖定粒度
  • NOWAIT - 遇鎖立即報錯不等待

最佳實踐建議

  1. 預設不加提示,讓資料庫引擎決定最佳鎖定策略
  2. NOLOCK 僅用於:可容忍髒讀的報表、統計、大量歷史資料掃描
  3. UPDLOCK 是「查詢-修改」模式的首選,減少死鎖機率
  4. 避免常態化使用 XLOCK/HOLDLOCK,嚴重影響並發
  5. 務必測試鎖定提示對並發效能的實際影響
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved