首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server SELECT 鎖定提示完整指南:NOLOCK、HOLDLOCK、UPDLOCK、TABLOCK、PAGLOCK、TABLOCKX 功能與適用場景

     編輯:MySQL 資料庫相關知識

SQL Server 提供豐富的 查詢提示 控制 SELECT 鎖定行為,覆寫交易隔離層級設定。本文系統整理六大鎖定提示的功能、行為差異與適用場景。

六大鎖定提示對照表

提示中文名鎖類型持有期間並發影響典型場景
NOLOCK不加鎖 / 髒讀無共享鎖即時釋放讀取未提交資料 (髒讀)、可能重複/遺漏列報表查詢、可容忍髒讀的大表掃描
HOLDLOCK保持鎖共享鎖 (S)交易結束防止幻讀,等同 SERIALIZABLE 範圍需可重複讀取 + 幻讀保護的交易
UPDLOCK更新鎖更新鎖 (U)交易/陳述式結束允許並發讀取 (S 相容),阻塞其他 U/X 鎖讀取後稍後更新,避免死結
TABLOCK表鎖 (共享)表級共享鎖 (S)陳述式結束阻塞所有寫入,允許並發讀取大量載入、全表掃描需一致性快照
PAGLOCK頁鎖 (預設)頁級共享鎖 (S)陳述式結束預設行為,粒度介於列/表之間一般查詢無需指定
TABLOCKX排他表鎖表級排他鎖 (X)交易/陳述式結束完全獨佔,阻塞所有讀寫大量刪除/截斷、DDL 維護窗口

關鍵行為差異

  • NOLOCK = READUNCOMMITTED:最高並發、最低一致性,**嚴禁用於財務/庫存等關鍵業務**。
  • HOLDLOCK = SERIALIZABLE:配合範圍鎖防止幻讀,並發度最低。
  • UPDLOCK:讀取階段取 U 鎖,轉更新時平滑升級為 X 鎖,**經典「查詢-更新」模式必備**,大幅減少死結。
  • TABLOCK/TABLOCKX:跳過列/頁鎖升級,直接表級鎖,減少鎖記憶體開銷,適合大批次操作。

使用語法

SELECT * FROM Orders WITH (NOLOCK) WHERE ...
SELECT * FROM Orders WITH (UPDLOCK, HOLDLOCK) WHERE ...
-- 多提示以逗號分隔,括號可省略單一提示

最佳實踐建議

  1. 預設不加提示,依賴資料庫隔離層級 (預設 READ COMMITTED)。
  2. 報表/BI 查詢大表可加 NOLOCK,但需文件化風險。
  3. 「先查後改」業務務必加 UPDLOCK,配合 HOLDLOCK 可達 SERIALIZABLE 效果。
  4. 大量刪除/匯入考慮 TABLOCKX / TABLOCK 減少鎖升級開銷。
  5. 提示會**忽略 SET TRANSACTION ISOLATION LEVEL**,需清楚當前實際隔離行為。

總結

六大鎖定提示對應不同並發/一致性取捨。**核心口訣:查詢用 NOLOCK(慎)、查改用 UPDLOCK、大批次用 TABLOCK(X)、嚴格一致用 HOLDLOCK**。實務中請依業務容忍度與並發壓力精準選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved