sql server中的with 鎖各種區別

📘 SQL Server 常用 WITH (Hint) 用法與組合場景對照表

Hint 組合作用說明常見用途是否阻塞他人是否讀臟數據備注
WITH (NOLOCK)不加共享鎖,允許讀取未提交數據報表導出、大數據分頁??等價于 READ UNCOMMITTED,臟讀風險高
WITH (HOLDLOCK)保持共享鎖直到事務結束(默認讀鎖是讀完就釋放)需要防止幻讀、讀取一致性要求高?(讀鎖)?類似 SERIALIZABLE,讀一致性好
WITH (UPDLOCK)讀取時申請更新鎖,防止其他事務更新“先查后改”場景,避免并發寫沖突?(寫鎖)?常用于檢查數據是否存在后決定更新插入
WITH (XLOCK)獨占鎖,阻止其他事務讀寫強一致性要求操作(如刪除、強制改)?(全鎖)?不建議長時間持有,影響并發
WITH (TABLOCK)表級共享鎖,鎖住整張表全表掃描、導出?(整表)?讀期間禁止別人寫
WITH (TABLOCKX)表級獨占鎖,整表禁止讀寫初始化數據、清空、批量更新?(強封鎖)?通常配合事務短時間使用
WITH (ROWLOCK)強制使用行鎖,避免鎖升級為頁/表鎖高頻并發插入、更新?? 取決于語句?僅做鎖粒度建議,SQL Server 可忽略
WITH (PAGLOCK)盡量使用頁鎖,適合中等范圍更新分批更新大量記錄?? 取決語句?少見,不如 ROWLOCK 常用
WITH (INDEX(IndexName))強制使用某個索引執行計劃優化器走錯索引時手動糾正不影響鎖行為?不影響鎖,僅影響執行路徑
WITH (FORCESEEK)強制走索引查找路徑優化器自動選擇表掃描導致性能低不影響鎖行為?通常用于調優大型表的慢查詢
WITH (FORCESCAN)強制走全表掃描與 FORCESEEK 相反不影響鎖行為?不推薦使用,除非確認 seek 更慢
WITH (NOEXPAND)不展開視圖,直接使用物化索引視圖使用 Indexed View 時保持優化器使用索引不影響鎖行為?僅對物化視圖有效,需特權支持
WITH (READCOMMITTED)強制使用已提交讀顯式指定默認隔離級別??和默認行為一致
WITH (READUNCOMMITTED)等價于 NOLOCK,允許臟讀報表、快照、對一致性容忍的數據訪問??用法不同但含義一致

? 常見 Hint 組合推薦(按場景)

組合 Hint用途場景描述說明
WITH (NOLOCK)報表分頁、大量讀取快速不阻塞,但可能臟讀
WITH (UPDLOCK, HOLDLOCK)先查再更避免“查完數據被別人改了”
WITH (ROWLOCK, UPDLOCK)并發更新,防止鎖沖突精細控制鎖粒度,避免鎖升級
WITH (XLOCK, ROWLOCK)強制對每行加獨占鎖限制讀寫并發,適合關鍵操作
WITH (TABLOCKX)初始化、清空整表封鎖全表,強一致但需快速提交事務
WITH (INDEX(...), NOLOCK)快速讀取指定索引加快查詢且不加鎖,臟讀風險存在
WITH (FORCESEEK, HOLDLOCK)精確讀取 + 保證一致性強制走索引 + 鎖住讀取數據
WITH (NOEXPAND)保持 Indexed View 性能避免視圖被展開為普通查詢

?? 使用注意事項

  • 多個 Hint 用英文逗號隔開,如:
    SELECT * FROM MyTable WITH (UPDLOCK, HOLDLOCK, ROWLOCK)

先查后改 — 避免“幻讀”和臟寫

BEGIN TRAN;SELECT Quantity
FROM Inventory WITH (UPDLOCK, HOLDLOCK)
WHERE ProductID = 1001;-- 假設庫存充足,執行扣減
UPDATE Inventory
SET Quantity = Quantity - 1
WHERE ProductID = 1001;COMMIT TRAN;

批量刪除數據時鎖表保護

BEGIN TRAN;DELETE FROM Orders WITH (TABLOCKX)
WHERE OrderDate < '2020-01-01';COMMIT TRAN;

強制使用索引加快查詢

SELECT OrderID, OrderDate
FROM Orders WITH (INDEX(IX_Orders_OrderDate))
WHERE OrderDate > '2025-01-01';

控制鎖粒度,避免鎖升級

UPDATE Products WITH (ROWLOCK, UPDLOCK)
SET Stock = Stock - 10
WHERE ProductID = 1234;

查詢某條記錄時保持鎖直到事務結束,防止臟寫

BEGIN TRAN;SELECT * FROM Accounts WITH (HOLDLOCK, ROWLOCK)
WHERE AccountID = 5678;-- 處理業務邏輯UPDATE Accounts
SET Balance = Balance - 100
WHERE AccountID = 5678;COMMIT TRAN;

復雜聯表查詢時,指定索引和讀未提交

SELECT o.OrderID, c.CustomerName
FROM Orders o WITH (NOLOCK, INDEX(IX_Orders_CustomerID))
JOIN Customers c WITH (NOLOCK)
ON o.CustomerID = c.CustomerID
WHERE o.OrderDate > '2025-01-01';

防止死鎖,鎖定行用于更新

BEGIN TRAN;SELECT * FROM Inventory WITH (UPDLOCK, ROWLOCK)
WHERE ProductID = 789;-- 執行更新
UPDATE Inventory
SET Quantity = Quantity - 5
WHERE ProductID = 789;COMMIT TRAN;
示例編號場景描述使用 Hint
1報表快速查詢NOLOCK
2庫存扣減防止超賣UPDLOCK, HOLDLOCK
3批量刪除防止并發訪問TABLOCKX
4索引優化查詢INDEX(索引名)
5精確鎖粒度控制ROWLOCK, UPDLOCK
6賬戶資金變更防臟寫HOLDLOCK, ROWLOCK
7聯表查詢+索引+不阻塞NOLOCK, INDEX(...)
8防止更新死鎖UPDLOCK, ROWLOCK

為什么用多個鎖提示?比如 UPDLOCK + HOLDLOCK

UPDLOCK的作用
只在讀取這條數據時加更新鎖(一種介于共享鎖和排他鎖的鎖)。

更新鎖允許其他事務讀取,但阻止其他事務獲得寫鎖。

這防止了兩個事務同時讀取后,都去更新數據造成沖突。

HOLDLOCK的作用
默認情況下,鎖在語句結束時釋放(例如,SELECT 語句讀完馬上釋放共享鎖或更新鎖)。

加了 HOLDLOCK,會將鎖保持到整個事務結束,防止其他事務在當前事務未提交前修改數據。

這樣可以避免“不可重復讀”和“幻讀”問題。

BEGIN TRAN;SELECT Quantity
FROM Inventory WITH (UPDLOCK, HOLDLOCK)
WHERE ProductID = 1001;-- 這里做業務判斷,比如庫存是否足夠
IF @quantity > 0
BEGINUPDATE InventorySET Quantity = Quantity - 1WHERE ProductID = 1001;
ENDCOMMIT TRAN;

如果只有 UPDLOCK,SELECT 語句結束后,鎖就釋放了,后續操作可能會被其他事務修改。

如果只有 HOLDLOCK,它是共享鎖,會阻止寫,但無法阻止其他事務讀取并加更新鎖,存在寫寫沖突風險。

兩者結合,讀的時候加更新鎖,且保持鎖直到事務結束,保證了安全性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86056.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86056.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86056.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

KES數據庫部署工具使用

一、啟動部署工具 Windows系統 #命令行 ${安裝目錄}/ClientTools/guitools/DeployTools/deploy.exeLinux系統 #命令行 [rootnode ~]# ${安裝目錄}/ClientTools/guitools/DeployTools/deploy二、環境配置 1.硬件要求 #都是最小配置 CPU&#xff1a;主流32或64位 內存&#…

TB62211FNG是一款采用時鐘輸入控制的PWM斬波器的兩相雙極步進電機驅動器

TB62211FNG是一款采用時鐘輸入控制的PWM斬波器的兩相雙極步進電機驅動器。該器件采用BiCD工藝制造&#xff0c;額定電壓為40伏/1.0安培。片上電壓調節器允許使用單一VM電源控制步進電機。 特點&#xff1a; ? 雙極性步進電機驅動器 ? 脈沖寬度調制&#xff08;PWM&#xf…

uni-app項目實戰筆記24--uniapp實現圖片保存到手機相冊

前提條件&#xff1a;微信小程序要想實現保存圖片到本地相冊需要到微信公眾平臺--小程序--開發管理中配置服務器域名中的downloadFile合法域名&#xff1a; \uniapp提供了saveImageToPhotosAlbum API實現保存的圖片到本地相冊。下面是它的配置參數&#xff1a; 參數名類型必填…

面試題-定義一個函數入參數是any類型,返回值是string類型,如何寫出這個函數,代碼示例

在 TypeScript 里&#xff0c;要定義一個入參為any類型、返回值為string類型的函數&#xff0c;可參考下面幾種實現方式&#xff1a; 1. 基礎實現 直接把入參轉換為字符串返回。 function anyToString(input: any): string {return String(input); // 使用String()進行類型轉…

TensorFlow深度學習實戰——Transformer模型評價指標

TensorFlow深度學習實戰——Transformer模型評價指標 0. 前言1. 質量1.1 GLUE1.2 SuperGLUE1.3 SQuAD1.4 RACE1.5 NLP-progress2. 參數規模3. 服務成本相關鏈接0. 前言 可以使用多種類型的指標評估 Transformer 模型。在本節中,我們將學習一些用于評估 Transformer 的關鍵因素…

linux內核學習(一)---內核社區介紹及補丁提交

目錄 一、引言 二、內核源碼 三、內核社區 ------>3.1、社區的組織架構 ------>3.2、內核社區的工作方式 ------>3.3、內核社區核心網站 ------------>3.3.1、Linux Kernel 官網 ------------>3.3.2、Linux Kernel 郵件列表(LKML) ------------>3.3…

輕量級web開發框架之Flask web開發框架學習:get請求數據的發送

Flask是一個使用 Python 編寫的輕量級 Web 應用框架&#xff0c;簡介靈活&#xff0c;可快速構建開發框架。 協作流程示例 客戶端請求 → Web服務器&#xff08;Nginx&#xff09; → WSGI服務器&#xff08;Gunicorn/uWSGI&#xff09;↓WSGI協議傳遞請求數據&#xff08;env…

Vue 3 異步三劍客:Suspense、async setup() 和 await 的戲劇性關系,白屏的解決

文章目錄 &#x1f3ad; Vue 3 異步三劍客&#xff1a;Suspense、async setup() 和 await 的戲劇性關系&#xff0c;白屏的解決&#x1f3ac; 角色介紹&#x1f3ad; 正常演出流程&#xff08;有 Suspense 時&#xff09;&#x1f4a5; 災難場景&#xff08;缺少 Suspense 時&a…

【JavaScript-Day 48】告別 Ajax,擁抱現代網絡請求:Fetch API 完全指南

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

BUUCTF在線評測-練習場-WebCTF習題[極客大挑戰 2019]Knife1-flag獲取、解析

解題思路 這題沒有什么解題思路&#xff0c;打開靶場&#xff0c;標題是白給的shell 頁面顯示了 eval($_POST["Syc"]); 這是php webshell命令&#xff0c;密碼為Syc&#xff0c;可直接通過該命令連接&#xff0c;根據標題提示&#xff0c;直接嘗試用蟻劍連接 連接成…

Qt—(Qt線程,Qt進程,,QT與sqlite數據庫)

一 Qt線程與進程概述 線程與進程對比 特性線程 (QThread)進程 (QProcess)內存空間共享父進程內存獨立內存空間創建開銷小 (幾MB)大 (幾十MB)通信方式共享內存/信號槽管道/套接字/文件崩潰影響導致整個進程終止僅自身終止適用場景高并發任務、計算密集型隔離第三方應用、安全需求…

計算機視覺階段一:CV入門基礎

目錄 學習目標&#xff1a; 一、核心知識點 二、實用工具推薦 三、學習內容與步驟 1.環境搭建 2.圖像獲取與顯示 3 圖像基礎處理 4 圖像幾何變換 5 圖像像素操作 四、實戰任務建議 實戰 1&#xff1a;圖像加載 顯示 保存 實戰 2&#xff1a;灰度圖 邊緣檢測 圖…

新增MCP接入和AutoAgent,漢得靈猿AI中臺1.6版正式發布!

漢得靈猿&#xff08;大圣&#xff09;AI中臺1.6版本&#xff0c;經過數月迭代&#xff0c;現已正式發布&#xff01; 新版本最被期待的新功能&#xff0c;無疑是4月份預告的MCP接入&#xff0c;而令人同樣激動的另一項新功能&#xff0c;則是AutoAgent動態規劃智能體。除了兩…

總結匯報思路

一、明確匯報目標 受眾需求&#xff1a;領導/客戶/團隊最關心什么&#xff1f;&#xff08;結果&#xff1f;問題&#xff1f;下一步計劃&#xff1f;&#xff09; 核心目的&#xff1a;展示成果&#xff1f;爭取資源&#xff1f;總結經驗&#xff1f;解決問題&#xff1f; 時…

文件鎖的藝術:深入解析 `fcntl(F_SETLK/F_GETLK)`

引言&#xff1a;在共享資源時代守護數據一致性 在多進程/多線程的應用場景中&#xff0c;文件作為一種共享資源常常面臨被并發訪問的挑戰。想象一個數據庫系統&#xff0c;多個客戶端可能同時嘗試修改同一數據文件&#xff1b;或者一個配置文件&#xff0c;需要確保在更新時不…

一個免費的視頻、音頻、文本、圖片多媒體處理工具

大家好&#xff0c;我是小悟。 給大家推薦一款可以免費使用的視頻、音頻、文本、圖片處理工具&#xff0c;名字叫百創工坊&#xff0c;不用下載&#xff0c;不用注冊&#xff0c;有免費的用就趕緊薅吧。 視頻工具 提取音頻&#xff1a;從視頻中提取音頻文件&#xff0c;支持多…

在 ef core 中操作復雜類型的序列化和反序列化時,如何全局設置 utf-8 編碼避免中文字符被轉義?

我們在使用 Entity Framework Core&#xff08;EF Core&#xff09; 時&#xff0c;如果希望 全局設置 JSON 序列化和反序列化使用 UTF-8 編碼&#xff0c;通常需要配置 System.Text.Json 的默認行為&#xff0c;因為 EF Core 6.0 及以上版本默認使用 System.Text.Json 進行 JS…

WPF CommunityToolkit.Mvvm 信使 (ObservableRecipient)

WPF CommunityToolkit.Mvvm 中的 ObservableRecipient 是什么&#xff1f; ObservableRecipient 是 .NET Community Toolkit MVVM 庫中的一個核心類&#xff0c;繼承自 ObservableObject。它專為 WPF 應用設計&#xff0c;提供以下核心功能&#xff1a; 基礎數據綁定支持&am…

《C++》命名空間簡述

文章目錄 一、命名空間定義二、訪問命名空間內的成員三、標準命名空間:std四、嵌套命名空間 一、命名空間定義 在C中&#xff0c;命名空間&#xff08;namespace)是一種將標識符分組的機制&#xff0c;用于避免重命名。例如&#xff1a; int a 3;int main() {int a 0;print…

【路徑規劃】基于Matlab的改進RRT算法二維/三維路徑規劃

基于Matlab的改進RRT算法二維/三維路徑規劃 一、引言 在機器人學、自動駕駛等領域&#xff0c;路徑規劃是一個關鍵問題&#xff0c;它旨在為機器人或車輛找到一條從起始點到目標點的安全、高效的路徑。RRT&#xff08;Rapidly-exploring Random Trees&#xff09;算法作為一種…