Sql Server 数据库事务与锁,同一事务更新查询锁的变化

news2025/1/18 0:44:57

我有一个People表,有三行数据:

image

如果我们没详细了解数据库事务执行加锁的过程中,会不会有这样一个疑问:如下的这段 SQL 开启了事务,并且在事务中进行了更新和查询操作。

BEGIN TRAN 
	update People set Name='张三' where id=1;
	
	select * from People where id=1;
commit tran

我们知道sql server数据库的默认事务级别是READ COMMITTED(已提交的读取),我们再看一下已提交读事务隔离级别描述:

允许事务读取另一个事务以前读取(未修改)的数据,而不必等待第一个事务完成。 SQL Server数据库引擎将保留 (对所选数据) 获取的写入锁,直到事务结束,但读取锁将在执行 SELECT 操作后立即释放。 这是SQL Server数据库引擎默认级别。

那么我们在READ COMMITTED 隔离级别下更新People表数据库,按照这个逻辑在id=1的数据行上添加排它锁(X锁)并等到事务提交后才会释放锁。
但是事务继续执行查询,在READ COMMITTED隔离级别下 Select 会对查询数据施加共享锁(S锁)。因为有排它锁,所以查询无法获得共享锁需要等待排它锁释放,如果按照这个逻辑的话这个事务自身就死锁无法执行了。

但这个事务还是会正常执行完成,针对这个疑问,那么我们看下数据库的事务和锁:

数据库引擎隔离级别

ISO 标准定义了以下隔离级别,SQL Server数据库引擎支持所有这些隔离级别:

隔离级别定义
未提交的读取隔离事务的最低级别,只能保证不读取物理上损坏的数据。 在此级别上,允许脏读,因此一个事务可能看见其他事务所做的尚未提交的更改。
已提交的读取允许事务读取另一个事务以前读取(未修改)的数据,而不必等待第一个事务完成。 SQL Server数据库引擎将保留 (对所选数据) 获取的写入锁,直到事务结束,但读取锁将在执行 SELECT 操作后立即释放。 这是SQL Server数据库引擎默认级别。
可重复的读取SQL Server数据库引擎会保留对所选数据获取的读取和写入锁定,直到事务结束。 但是,因为不管理范围锁,可能发生虚拟读取。
可序列化隔离事务的最高级别,事务之间完全隔离。 SQL Server数据库引擎保留对所选数据获取的读取和写入锁定,这些锁将在事务结束时释放。 SELECT 操作使用分范围的 WHERE 子句时获取范围锁,主要为了避免虚拟读取。 注意: 请求可序列化隔离级别时,复制的表上的 DDL 操作和事务可能失败。 这是因为复制查询使用的提示可能与可序列化隔离级别不兼容。

image


SQL Server数据库引擎使用不同的锁模式锁定资源,这些模式确定并发事务如何访问资源。

T-SQL 设置事务隔离级别,只对当前会话连接一直有效

SET TRANSACTION ISOLATION LEVEL
    { READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ
    | SNAPSHOT
    | SERIALIZABLE
    }

锁模式

下表显示了SQL Server数据库引擎使用的资源锁模式。

锁模式说明
共享 (S)用于不更改或不更新数据的读取操作,如 SELECT 语句。
更新 (U)用于可更新的资源中。 防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
排他 (X)用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。 确保不会同时对同一资源进行多重更新。
意向用于建立锁的层次结构。 意向锁包含三种类型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。
架构在执行依赖于表架构的操作时使用。 架构锁包含两种类型:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。
大容量更新 (BU)在将数据大容量复制到表中且指定了 TABLOCK 提示时使用。
键范围当使用可序列化事务隔离级别时保护查询读取的行的范围。 确保再次运行查询时其他事务无法插入符合可序列化事务的查询的行。

锁兼容性

锁兼容性控制多个事务能否同时获取同一资源上的锁。 如果资源已被另一事务锁定,则仅当请求锁的模式与现有锁的模式相兼容时,才会授予新的锁请求。 如果请求锁的模式与现有锁的模式不兼容,则请求新锁的事务将等待释放现有锁或等待锁超时间隔过期。 例如,没有与排他锁兼容的锁模式。 如果具有排他锁(X 锁),则在释放排他锁(X 锁)之前,其他事务均无法获取该资源的任何类型(共享、更新或排他)的锁。 另一种情况是,如果共享锁(S 锁)已应用到资源,则即使第一个事务尚未完成,其他事务也可以获取该项的共享锁或更新锁(U 锁)。 但是,在释放共享锁之前,其他事务无法获取排他锁。

下表显示了最常见的锁模式的兼容性。

image

查看执行时锁的情况

通过锁的兼容性模式我们知道在id=1的行上添加了排它锁,那么它就无法再接收任何锁,那我们调试这个事务看看锁的情况。

image

我们调试到第3行,这个时候看下锁的情况,此时事务添加了key(行)排它锁X锁,page(页)和object(表)添加了意向排它锁IX锁

SELECT 
resource_type,
resource_database_id,
resource_description,
request_mode,
request_type,
request_session_id,
request_owner_type,
request_owner_id,
lock_owner_address
FROM sys.dm_tran_locks where request_owner_type='transaction'

image

然后我们再继续调试到第4行,此时还没提交事务,排它锁X依然存在,但是没有S锁。

image

我们知道在读提交事务隔离级别下,S锁是使用完了就释放的,所以我们用SQL Server Profiler来监视下锁的情况,设置监控的项为lock,然后设置筛选条件。

image

image

上面我已经将 张三1 改为了 张三,我们再将 张三 改回 张三1,并启动监控。

BEGIN TRAN 
	update People set Name='张三1' where id=1;
	select * from People where id=1;
commit tran

image

可以看到事务 transactionid=30010685 的锁监控 :

  • 首先申请IX更新意向锁(object,page) 准备更新,然后获得行上的X排它锁进行更新,更新后释放了行锁和page锁(EventClass= Lock:released,Mode=0-null)。
  • 等查询时申请page页IS意向读取锁,并获得行S锁读取数据后释放行锁和page页锁。
  • 最后还有几个顺序释放,依次是key、page、Object,这里恰好和上面调试还没提交事务时查询sys.dm_tran_locks的锁情况一样,也就是说事务提交后依次又进行了一遍释放。

通过上面我们得出结论,事务里面并不是取得了X锁要等事务结束后才释放,在事务执行过程中也是有释放的,只是事务还保持着对于锁在事务层面的记录,防止其它事务并发(这里是我推断的,没找到相关文献说明)。
所以事务是在锁上更宏观的逻辑隔离,事务隔离级别只是在业务上保证数据符合隔离级别预期,至于事务中如何控制锁是基于数据库内在设计,而不能通过事务的描述去推断锁过程。

我查阅网上很多博文和官方资料都是讲事务和锁概念,有时候结合两种也是模棱两可看不出什么强联系,没有讲事务执行过程中锁是如何变化的,不知道我这篇推论是否正确,欢迎指正。

再次验证

我将事务隔离级别设置为REPEATABLE READ(可重复读),然后调试到commit行还没提交,我们看跟踪的锁和事务锁表dm_tran_locks查询的结果,按照REPEATABLE READ描述,select查询的S锁会在事务提交后释放,我们看看截图情况

image

开启了SQL Server Profiler结果,查询id=3后S锁已经释放。

image

再查dm_tran_locks表,表中依然显示事务获取了S锁,并且 resource_description=98ec012aa510 资源描述和上面跟踪是对应的。

image

最后我们执行完调试,跟踪锁显示又按照顺序释放了一遍锁 

image

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI绘画工具MJ新功能有点东西,小白也能轻松一键换装

先看最终做出来的效果 直接来干货吧。Midjourney,下面简称MJ 1.局部重绘功能来袭 就在前两天,MJ悄咪咪上线了这个被众人期待的新功能:局部重绘。 对于那些追求创新和个性化的设计师来说,局部绘制不仅是一个实用的功能&#xff…

Smartbi电子表格软件版本更新,首次推出Excel轻应用和语音播放

Smartbi电子表格软件又又又更新啦! 此次更新,首次推出了新特性——Excel轻应用和语音播报。另外,还对产品功能、Demo示例、配套文档进行了完善和迭代。 低代码开发Excel轻应用 可实现迅速发布web应用 业务用户的需求往往都处于“解决问题”…

无涯教程-进程 - 简介

进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。另外,系统空间是“公共场所”,各进…

重磅!云智慧监控宝这些功能免费用啦

自云智慧推出监控宝以来,各行业领域反映强烈,现已有超过24万人次使用监控宝官网的免费试用功能。得益于诸多企业及用户对监控宝热情的持续升温,云智慧释放技术红利,推出监控宝免费使用福利,面向中小型企业提供监控宝核…

YOLO目标检测——耳环数据集下载分享

耳环数据集 耳环数据集是用于研究和分析耳环相关问题的数据集,包含了各种不同类型和风格的耳环图像,共同2600张高清图片 数据集点击下载:YOLO耳环数据集2600图片.rar

如何利用链路追踪快速定位问题

“中浩,xxx接口报错了你看一下咋回事” “稍等一下哈,我看一下。Xxx组的xxx接口报错了,我们这边直接抛错了” “具体啥问题啊,你看下日志,我去找xxx组的人问一下,现在阻塞流程了啊” “呃。。。对这个接口的请求日志…

WebDAV之π-Disk派盘 + 一刻日记

一刻日记是一款日记、笔记和备忘录应用程序,旨在提供一个简单而专注的日记写作工具。它提供了一个干净、直观的界面,允许用户记录和管理他们的日常事务、个人情感、成就和目标等内容。 一刻日记的主要功能包括: – 创建和编辑日记、用户可以撰写和编辑自己的日记,记录重要…

腾讯云服务器租用价格表_一年、1个月和1小时报价明细

腾讯云服务器租用费用表:轻量应用服务器2核2G4M带宽112元一年,540元三年、2核4G5M带宽218元一年,2核4G5M带宽756元三年、云服务器CVM S5实例2核2G配置280.8元一年、GPU服务器GN10Xp实例145元7天,腾讯云服务器网长期更新腾讯云轻量…

Gitee API的使用|如何批量删除Gitee下的所有仓库

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/cate…

【LeetCode 】数组简介

集合列表和数组 本文中介绍的概念为适用于所有编程语言的抽象理论,具体实现会由编程语言的不同而稍有差别。 具体介绍数组之前,我们先来了解一下集合、列表和数组的概念之间的差别。 集合 集合一般被定义为:由一个或多个确定的元素所构成的…

数字人直播软件火爆!为何越来越多人看好无人直播的应用前景?

随着科技的不断发展,数字人直播的应用前景正在逐渐明朗化。数字人是指利用计算机技术创建的一种虚拟人物,可以模仿真人的声音、表情、动作等,具有很高的仿真度和互动性。数字人直播是指通过数字人技术实现的一种直播方式,可以让观…

成都睿趣科技:抖音开网店前期的流程是什么

随着互联网的快速发展,电子商务成为了商业领域中的一大利器,而在电商领域中,抖音作为一个强大的平台,也吸引了众多商家的目光。然而,要在抖音上开设一家成功的网店,并不是一件简单的事情,需要经…

Android kotlin系列讲解(入门篇)如何运行Kotlin代码

<<返回总目录 学习一下快速入门kotlin编程,这是都不会涉及Android开发。既然暂时和Android无关了,那么首先要解决的一个问题就是怎样独立运行一段kotlin代码。 开始使用Android Studio,遗憾的是,Android Studio作为一个专门用于开发Android应用程序的工具,只能创建A…

视频转mp3格式怎么弄?这个方法轻松转换

将视频转换为MP3格式可以将视频中的音频提取出来&#xff0c;这样可以让我们在任何时候任何地方聆听音频&#xff0c;而不需要观看视频。此外&#xff0c;MP3格式也是一种压缩格式&#xff0c;可以节省存储空间并更轻松地共享音频文件。那么怎么把视频转成MP3格式呢&#xff1f…

金融学博迪第4章作业

金融学第四章作业题目 1.推导名义利率i、实际利率r与通货膨胀率ρ之间的关系式。 注:名义利率(nominal interest rate)用in表示,实际利率(real interest rate)用ir表示,通货膨胀率用ρ表示。 答:假设现在用 元购买价格为 的商品,可以得到个 单位商品。如果推迟至一…

【C++设计模式】用动画片《少年骇客》(Ben10)来解释策略模式

2023年8月25日&#xff0c;周五上午 今天上午学习设计模式中的策略模式时&#xff0c;发现这个有点像很多卡通片里面的变身器... #include<iostream>//alien hero是外星英雄的意思 //在《少年骇客》中&#xff0c;主角可以通过变身器变成10种外星英雄 class AlienHero{ …

【附安装包】Fuzor2020安装教程

软件下载 软件&#xff1a;Fuzor版本&#xff1a;2020语言&#xff1a;简体中文大小&#xff1a;5.63G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.5GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.baidu.co…

浅析 GlusterFS 与 JuiceFS 的架构异同

在进行分布式文件存储解决方案的选型时&#xff0c;GlusterFS 无疑是一个不可忽视的考虑对象。作为一款开源的软件定义分布式存储解决方案&#xff0c;GlusterFS 能够在单个集群中支持高达 PiB 级别的数据存储。自从首次发布以来&#xff0c;已经有超过十年的发展历程。目前&am…

Ebay账号关联怎么办?如何防关联?店铺多开干货

Ebay是明确不允许一个卖家有多个ebay账户的&#xff0c;做跨境电商的朋友为了“不在一颗树上吊死”&#xff0c;大家都想多注册几个账号开几个店铺来拦截更多流量和分摊风险。但是eBay平台规定是只允许一个卖家一个账号的&#xff0c;一旦检测到多开账户的情况&#xff0c;eBay…

微信录屏怎么录?2种方法教会你

“微信怎么录屏呀&#xff0c;奶奶不会用微信&#xff0c;打电话跟她讲&#xff0c;怎么也说不清楚&#xff0c;老人家年纪大了&#xff0c;耳朵不好使&#xff0c;就想录一个微信使用教程给她&#xff0c;可是不懂怎么录屏&#xff0c;有人知道微信怎么录屏吗&#xff0c;感谢…