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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;算法作为一种…