SqlServer中的锁(仅供参考,可能有不准确的地方)

news/2024/9/19 12:39:10/文章来源:https://www.cnblogs.com/leavind/p/18418129
SqlServer中的锁(仅供参考,可能有不准确的地方) - MyMemo - 博客园 (cnblogs.com)
 锁模式 | Microsoft Learn

共享锁 (Shared Lock):

表示一个事务正在读取一行数据,其他事务也可以读取同一行数据,但不能进行写操作。
也称为 "S锁" 或 "读锁"。

典型应用场景:当一个事务需要读取数据而不修改它时,可以使用共享锁。多个事务可以同时获取共享锁,并且彼此之间不会产生冲突。

-- 在事务中获取共享锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (TABLOCKX, HOLDLOCK) WHERE column_name = 'value';
-- 其他事务可以读取同一行的数据,但不能进行写操作
COMMIT;

排他锁 (Exclusive Lock):

表示一个事务正在对一行数据进行写操作,并阻止其他事务对同一行进行读或写操作。
也称为 "X锁" 或 "写锁"。

典型应用场景:当一个事务需要对数据进行修改或删除操作时,可以使用排他锁。该锁会阻止其他事务对同一行进行读取或写入,确保数据的一致性。

-- 在事务中获取排他锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (XLOCK) WHERE column_name = 'value';
-- 其他事务无法读取或写入同一行的数据
COMMIT;

更新锁 (Update Lock):

用于实现读取操作和避免并发更新冲突的特殊锁定模式。当一个事务使用更新锁时,其他事务也可以读取同一行数据,但不能进行写操作。
更新锁是共享锁和排他锁之间的折衷选择。
也称为 "U锁" 或 "升级锁"。

典型应用场景:在读取数据时,如果事务预计可能在稍后需要对数据进行更新操作,但目前仅需要共享访问权限,可以使用更新锁。这样可以避免读取和更新之间的竞争条件,提高并发性。

-- 在事务中获取更新锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (UPDLOCK) WHERE column_name = 'value';
-- 其他事务可以读取同一行的数据,但不能进行写操作
COMMIT;

表锁 (Table Lock):

锁定整个表,阻止其他事务对该表的读或写操作。
表级锁可能对并发性产生较大影响,因为它限制了其他事务对表的访问。

典型应用场景:当需要对整个表进行大规模的操作,如数据重建、表结构修改等,可以使用表锁。这会阻止其他事务对表进行读取或写入操作,确保操作的完整性。

-- 在事务中获取表锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (TABLOCKX) WHERE column_name = 'value';
-- 其他事务无法读取或写入整个表
COMMIT;

页级锁 (Page Lock):

锁定表的数据页,即一组相邻的数据行。
页级锁通常用于较大的事务或特定的锁定提示。

典型应用场景:在某些情况下,表中的数据按页组织,而不是按行组织。当需要访问特定数据页时,可以使用页级锁。这可以减少锁的粒度,提高并发性能。

-- 在事务中获取页级锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (PAGLOCK) WHERE column_name = 'value';
-- 其他事务无法读取或写入同一数据页的数据
COMMIT;

行级锁 (Row Lock):

锁定表的单个数据行。
行级锁提供了最细粒度的并发控制,但也可能导致更多的锁开销和资源争用。

典型应用场景:当需要对表中的特定行进行操作时,可以使用行级锁。这允许并发事务对不同行进行读取和写入操作,提高并发性能。

-- 在事务中获取行级锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (ROWLOCK) WHERE column_name = 'value';
-- 其他事务无法读取或写入同一行的数据
COMMIT;

此外,还存在其他一些重要的锁类型,包括:

键值锁 (Key-Range Lock):

锁定表中的一定范围的键值,通常与范围查询和索引操作相关。
键值锁用于防止并发操作引起的范围扫描和索引不一致性。

典型应用场景:当进行范围查询或索引操作时,可以使用键值锁。它可以锁定一定范围的键值,以确保范围扫描的一致性。

-- 在事务中获取键值锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (XLOCK) WHERE column_name BETWEEN 'value1' AND 'value2';
-- 其他事务无法读取或写入指定键值范围内的数据
COMMIT;

意向锁 (Intent Lock):

用于指示一个事务已经在某一级别上持有锁,以阻止其他事务对更精细级别的锁定进行操作。
意向锁包括意向共享锁 (IS) 和意向排他锁 (IX)。

典型应用场景:意向锁用于指示事务在特定级别上持有锁,以避免其他事务获取冲突的更细粒度锁。它通常与其他锁类型结合使用。

-- 在事务中获取意向锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (IS) WHERE column_name = 'value';
-- 其他事务无法获取排他锁(X锁)
COMMIT;

共享更新锁 (Shared Update Lock):

允许多个事务同时获取对同一数据行的共享更新锁,以支持并发读取和更新操作。

典型应用场景:当多个事务需要同时读取并更新同一数据行时,可以使用共享更新锁。这允许多个事务同时获取对同一数据行的共享更新锁,以支持并发读取和更新操作。

-- 在事务中获取共享更新锁
BEGIN TRANSACTION;
SELECT * FROM table_name WITH (SIXU) WHERE column_name = 'value';
-- 允许多个事务同时获取对同一数据行的共享更新锁,支持并发读取和更新操作
COMMIT;

这些是 SQL Server 中的一些常见和重要的锁类型,用于控制并发性和维护数据完整性。在设计和优化数据库应用程序时,了解不同类型的锁以及它们的行为和影响是至关重要的。

上述9种锁的横向对比:

锁类型并发性锁定粒度锁定范围冲突适用场景
共享锁 (Shared Lock) 行级 仅限读 读冲突 并发读取,不修改数据
排他锁 (Exclusive Lock) 行级 整个行 读写冲突 数据修改,防止其他事务读取或写入同一行数据
更新锁 (Update Lock) 行级 仅限读 写冲突 并发读取,预计稍后可能需要对数据进行更新
表锁 (Table Lock) 表级 整个表 读写冲突 大规模操作,如数据重建、表结构修改等
页级锁 (Page Lock) 页级 数据页 读写冲突 针对按页组织的数据,减少锁的粒度以提高并发性能
行级锁 (Row Lock) 行级 单个数据行 读写冲突 针对特定行的读写操作
键值锁 (Key-Range Lock) 键值范围 指定键值范围 读写冲突 范围查询或索引操作
意向锁 (Intent Lock) - 数据结构级 整个数据结构 冲突解决 协调低层次锁定请求的锁
共享更新锁 (Shared Update Lock) 行级 单个数据行 读冲突 并发读取和更新同一行

注意:表格中的并发性指的是该锁对并发读写操作的支持程度,高表示较好的并发性能,低表示较差的并发性能。锁定粒度指的是锁定的对象粒度,可以是行、页或表级别。锁定范围指的是锁定的数据范围,可以是单个行、整个表或键值范围等。冲突表示该锁类型与其他锁类型之间可能发生的冲突。适用场景指的是每种锁类型常见的使用场景。

请注意,锁的选择取决于具体的业务需求和并发控制策略。在实际应用中,需要根据具体情况选择适当的锁

在SQL Server中,有几种不同的排他锁类型。以下是常见的排它锁:

  • XLOCK:
    XLOCK 是一种行级排它锁,用于阻止其他事务对同一行数据进行读取或写入操作。
    当一个事务使用 XLOCK 锁定一行数据时,其他事务无法同时读取或写入相同的数据行。

  • TABLOCKX:
    TABLOCKX 是一种表级排它锁,用于阻止其他事务对整个表进行读取或写入操作。
    当一个事务使用 TABLOCKX 锁定一张表时,其他事务无法同时读取或写入相同的表。

  • HOLDLOCK:
    HOLDLOCK 是一种保持锁的提示,用于在整个事务期间保持排它锁。
    当一个事务使用 HOLDLOCK 提示时,它会保持已经获取的锁,直到事务结束。

  • UPDLOCK:
    UPDLOCK 是一种特殊的锁定提示,用于实现读取操作和避免并发更新冲突。
    当一个事务使用 UPDLOCK 提示时,其他事务可以读取相同的数据行,但不能对其进行写操作。
    这些排它锁类型可以根据具体的业务需求和并发控制策略进行选择和使用。它们提供了不同的锁定粒度和锁定范围,用于控制对数据的访问和修改。需要注意的是,在使用排它锁时,应注意锁的粒度和范围,避免过度锁定导致并发性能下降。

TABLOCKX 和 XLOCK在功能和使用上的区别:

  1. TABLOCKX:

    • TABLOCKX 是一种表级排他锁,用于阻止其他事务对整个表进行读取或写入操作。
    • 当一个事务使用 TABLOCKX 提示时,其他事务无法同时读取或写入相同的表。
    • TABLOCKX 是一种较强制的锁定方式,它会阻止其他事务对整个表的任何访问,包括读取和写入操作。
    • TABLOCKX 通常在需要对整个表进行大规模修改或操作时使用,例如数据重建、表重命名等。
  2. XLOCK:

    • XLOCK 是一种行级排他锁,用于阻止其他事务对同一行数据进行读取或写入操作。
    • 当一个事务使用 XLOCK 提示时,其他事务无法同时读取或写入相同的数据行。
    • XLOCK 是一种较强制的锁定方式,它会阻止其他事务对同一行数据的任何访问,包括读取和写入操作。
    • XLOCK 通常在需要对特定行进行修改或操作时使用,例如数据更新、删除等。

总结来说,TABLOCKX 是一种表级排他锁,阻止其他事务对整个表进行访问,而 XLOCK 是一种行级排他锁,阻止其他事务对特定行数据进行访问。选择使用哪种锁取决于具体的业务需求和并发控制策略。需要注意的是,过度使用强制性的锁定提示可能会导致并发性能下降,因此应该谨慎使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799228.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SDK实现广播的流程

其中APP:application 指应用程序 SD:softdevice    指蓝牙协议栈 SCANNER: 指扫描设备您的资助是我最大的动力!金额随意,欢迎来赏!如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。如果,您希望更容易地发现我的新博客,不妨点击一下绿色通…

ZBlogPHP提示非法访问,验证码不显示,验证码报错

针对您在 ZBlogPHP 升级后遇到的问题,以下是解决步骤:定位文件位置使用 FTP 客户端或者通过您的虚拟主机控制面板中的文件管理器找到 zb_users 目录。 打开 c_option.php 文件。修改配置选项在 c_option.php 文件中找到如下两行配置:phpZC_LOGIN_CSRFCHECK_ENABLE => tru…

【Java】若依框架(RuoYi-master)——8.文件上传

若依框架的自带上传和下载功能,但需要我们进行恰当的操作(具体也可以参考示例和源码)。新建表格 新建一张学生信息表(这里的字段、文件路径、文件名称与改说明相关):DROP TABLE IF EXISTS `sys_student`; CREATE TABLE `sys_student` (`student_id` int NOT NULL AUTO_I…

STP

STP简介STP 背景 传统拓扑环境,设备与设备之间只存在单条链路进行连接,就会产生单点故障的问题,为了解决单点故障问题,进行冗余环境的部署,但是冗余环境又会产生很多问题,造成环路,环路中又存在其他的问题:广播风暴、帧的多个副本、MAC地址表不稳定等 STP作用 STP:生成…

牛客周赛60

A 困难数学题一个数异或其本身就是0,直接输出0就好 B 构造序列正负数要相邻,那最长的序列肯定是数量最多的数放第一个,例3a2b ,a baba,ba为一组,最后结果为少的数的两倍+最开始的那个数,特判两数相等情况点击查看代码 ll a, b;cin >> a >> b;if (a < b){sw…

Ros2- Moveit2- Subrame( 子坐标 )

子坐标是在CollisionObjects上定义的坐标。 它们可用于定义您放置在场景中的对象上的兴趣点,例如瓶子的开口、螺丝刀的尖端或螺丝的头部。它们可用于规划和编写机器人指令,例如“拿起瓶子,然后将开口移到水龙头的喷口下方”,或“拿起螺丝刀,然后将其放在螺丝头上方”。 编…

精简实用!一分钟搭建文件管理服务!

Dufs —— 一款多功能的实用文件服务器。不仅支持静态文件的托管服务,还具备文件上传、搜索以及访问控制等功能,并且兼容 WebDAV 协议,支持 HTTPS 加密连接,保障了数据传输的安全性。大家好,我是 Java陈序员。 今天,给大家介绍一款精简实用的文件托管服务,一分钟即可搭建…

微信小程序wx.request请求封装

config.js // 请求地址 const BASE_URL = "https://localhost:8080" const TIMEOUT = 10000export {BASE_URL,TIMEOUT }server.js 假设这里返回的数据结构为 {"code": 0,"msg": "提示信息","data": "返回数据" }当…

[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离

今天带来一款优秀的项目:个人博客系统源码 。 系统采用的流行的前后端分离结构,内含功能包括 "写博客文章",“修改博客文章”,“富文本编辑器”,“评论管理”“管理员角色”,“游客角色”,“文章标签”,“文章分类” 如果您有任何问题,也请联系小编,小编是…

99元阿里云服务器部署若依前后端分离版(ruoyi-vue)

1. 购买阿里云 最近阿里云推出99元套餐,相当划算,薅羊毛搞起 ->新老同享阿里云99一年系统选择centos 2. 安装JDKJDK >= 1.8 虽说推荐1.8版本,但毕竟有点老,我选的JDK17,安装过程如下: # 下载安装包 wget https://download.oracle.com/java/17/archive/jdk-17.0.1_l…

.NET 开源工业级移动端仓库管理系统

前言 在工业生产中,定制化的软件对于每个环节都至关重要。对于仓库管理,推荐一款开源的仓库管理系统(WMS)解决方案。 这款基于.NET 框架开发的移动应用,提供了全面的仓库操作、订单处理、主数据管理、数据分析及个人信息设置等功能,是工业仓库管理的有利助手。 项目介绍 …

Linux下eCal测试计划及进度记录

完整的源代码包:# 安装依赖 sudo apt-get install git cmake doxygen graphviz build-essential zlib1g-dev sudo apt-get install libhdf5-dev libprotobuf-dev libprotoc-dev protobuf-compiler sudo apt-get install libcurl4-openssl-dev libqwt-qt5-dev libyaml-cpp-dev…