本例中使用begin tranwith (holdlock)提示来观察SQL Server在select语句中的锁。
开启事务是为了保证时间极短的查询也能观察到锁情况,holdlock相当于开启序列化事务隔离级别,只有在提交后才会释放锁,且对索引加键范围锁防止幻读。
1. 查询主键索引的select语句
其上锁情况为:
这里我选择了一较为靠前的主键值,结果集有6条,因为是序列化隔离级别的键范围锁,所以持有7个KEY类型的RangeS-S锁(键范围锁,防止幻读),此外这些记录都在一个页中(1:3104页),因此最终的情况就是上图所示的7个KEY锁和一个数据页的IS锁。7个键范围锁中有6个锁对应6个主键数据行,剩下1个锁定虚拟键防止幻读。注意键范围锁只会在索引行上出现,且只针对select语句,目的是防止幻读。
需要注意的是如果范围查询的KEY值过多(约为5000),则会发生锁升级,此时只会在表上加一个S锁,释放掉所有的主键KEY锁和IS表锁。锁升级只会由行锁或页锁直接升级为表锁,不存在行锁升级为页锁的情况。关于锁升级参见官网锁升级相关页面。
这里需要特别说明的是默认的事务隔离级别下其实key锁加的不是键范围锁,而是S锁,这里之所以显示ranges-s只是因为holdlock的作用,导致出现的是键范围锁。
2. 查询非聚集索引的select语句
其上锁情况为:
PatientID是一个非唯一非聚集索引,结果集只有1条,加两个KEY键范围锁,当然键所在的索引页22872本身也需要一个IS锁,之后书签查找需要在数据页3104上加IS锁以便获取其中数据行,最后在相关的数据行上加S类型的KEY锁。
这里我们再使用dbcc page看一下索引页22872的内容:(这里只截取了前10行)
可以发现非聚集索引页的书签就是主键聚集索引的KEY值,Oracle索引的书签则全部是RowID。 
 
3.进行全表扫描的select语句
1)当我直接执行 select * from ris_request时其加锁情况是:
select语句会为表上读到的的每个页依次加锁,读完且获取到下一个页的S锁时释放本页的S锁,表上只有一个IS锁。
2)当我加了with (holdlock)时: 
开始时语句会在很多page上加S锁,并在表上加IS锁,但是很快就会转化为如下图的情况,锁升级为一个表级S锁,S页锁全释放。
 

SQL Server 锁实验(SELECT加锁探究)的更多相关文章

  1. SQL Server 锁实验(UPDATE加锁探究)

    update语句: 本例中由于看到的是update执行完的锁情况,因此无法看到IU锁,但其实针对要修改的数据页和索引页会先加IU锁,记录和键先加U锁,然后再转化为IX和X锁. 如果想要看到IU锁和U锁 ...

  2. SQL Server 锁实验(INSERT加锁探究)

    insert语句: 其上锁情况为: insert语句会对表上的所有索引作出更新,因此这里看到的索引列较多,我们先把所有的索引搞出来看看: 可以看到所有索引都涉及到了,然后我们来仔细分析下加锁情况: 1 ...

  3. SQL Server 锁实验(重建索引)

    昨晚某现场报一个重建索引失败的问题,远程查看后发现是自动收缩的内部会话引发的锁申请超时,突然想起来自己的加锁实验还没完成索引重建部分,今天有空正好做一下: USE [数据库名] GO ALTER IN ...

  4. [转]了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密_Mr_Indigo的空间

    了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密 关系型数据库,如SQL Server,使用锁来避免多用户修改数据时的并发冲突.当一组数据被某个用户锁定时,除非第一个用户结束修 ...

  5. 了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密

    关系型数据库,如SQL Server,使用锁来避免多用户修改数据时的并发冲突.当一组数据被某个用户锁定时,除非第一个用户结束修改并释放锁,否则其他用户就无法修改该组数据. 有些数据库,包括SQL Se ...

  6. SQL Server锁类型

    SQL Server锁类型(SQL)收藏 1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁. 2. NOLOCK:不添加共享锁和排它锁,当这个选项生 ...

  7. 转:sql server锁知识及锁应用

    sql server锁(lock)知识及锁应用 提示:这里所摘抄的关于锁的知识有的是不同sql server版本的,对应于特定版本时会有问题. 一 关于锁的基础知识 (一). 为什么要引入锁 当多个用 ...

  8. sql server 锁与事务拨云见日(上)

    一.概述 讲到sql server锁管理时,感觉它是一个大话题,因为它不但重要而且涉及的知识点很多,重点在于要掌握高并发要先要掌握锁与事务,涉及的知识点多它包括各式各样的锁,锁的组合,锁的排斥,锁延伸 ...

  9. SQL SERVER锁(LOCK)知识及锁应用

    提示:这里所摘抄的关于锁的知识有的是不同sql server版本的,对应于特定版本时会有问题. 一 关于锁的基础知识 (一). 为什么要引入锁 当多个用户同时对数据库的并发操作时会带来以下数据不一致的 ...

随机推荐

  1. leetcode — combinations

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...

  2. linux 命令 — find

    find 基本形式 find base_path base_path可以是任何目录,find会从该目录开始往下寻找 find . -print 列出当前目录下所有的文件和目录,以'\n'作为分隔符 f ...

  3. SharePoint如何配置Ipad跳转等问题

    如何配置Ipad跳转 Apple iPad 设备上不支持 SharePoint 标准视图.用户可以改用移动视图在 iPad 设备上查看 SharePoint 内容.默认情况下,iPad 用户被重定向到 ...

  4. [转]windows BLE编程 net winform 连接蓝牙4.0

    本文转自:https://www.cnblogs.com/webtojs/p/9675956.html winform 程序调用Windows.Devices.Bluetoot API 实现windo ...

  5. 第一册:lesson sixty five.

    原文: Not a baby. A:What are you going to do this evening Jill? B:I'm going to meet some friends, dad. ...

  6. ABP Changing Httpcode status

    小弟初来乍到,分享一些工作学习中遇到的问题和解决方式,如有不准确或是有错误的地方,希望不吝赐教,谢过了.  --Dogtwo 起因: ABP 中异常处理的思路是很清晰的.一共五种类型的异常类. Abp ...

  7. C# winform自动更新 (附 demo下载)

    随着需求的变化,如果Server每次更新出新的内容,Client都要重新安装的话. 太过于复杂化.  所以自动更新是很有必要的. 一..NET自带的更新方式    以服务器端为主  (自动更新,微软爸 ...

  8. tomcat和jdk版本兼容(Tomcat版本要比jdk高)

    用的tomcat是低版本的,但是用的jdk却是高版本的,用Servlet做的项目运行都没有问题,但是直接运行jsp却死活都运行失败. 最后发现是tomcat和jdk的版本问题造成的. 总结如下: to ...

  9. ASP.NET登录验证

    protected void btnLogin_Click(object sender, EventArgs e) { string username = txtUserName.Value.Trim ...

  10. [Linux] Nginx响应压缩gzip

    压缩和解压缩 .本节介绍如何配置响应的压缩或解压缩以及发送压缩文件. gzip on; .NGINX仅使用MIME类型text / html压缩响应 gzip_types text/plain app ...