本例中使用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. python练习三—解析xml

    使用python解析xml,主要使用sax的ContentHandler中的标签开始和标签结束的方法驱动,然后在开始(或者结束)事件中决定使用什么处理方法,使用dispatcher来决定并分发到指定方 ...

  2. 使用Hexo搭建个人博客的终极资料

    一.前言 Hexo 是一个基于 NodeJs 博客框架,可以快速的帮我们搭建一个博客系统,Hexo使用的是Markdown(下文简称MD)解析文章的,在几秒内即可利用靓丽的主体生成静态网页. 推荐使用 ...

  3. MySQL中间件之ProxySQL(4):多层配置系统

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.ProxySQL中的库 使用ProxySQL的Admin管理接口连 ...

  4. 脚本解决.NET MVC按钮重复提交问题

    见于:Avoiding Duplicate form submission in Asp.net MVC by clicking submit twice 脚本代码: $(document).on(' ...

  5. .NET使用ServerManager获取网站物理路径

    最近因为工作需要,用wpf做了一个辅助小工具,如下图 为了获取网站的物理路径,我分析了通过ServerManager获取到的变量,也通过百度搜索了很多,但仍然没有找到方法. 后来使用必应,在国外网站找 ...

  6. .net 后台判断是否要替换

    Response.Write("<script>window.onload=function (){if(confirm(\"该文件已经存在,确定要替换吗吗?\&quo ...

  7. springMVC_02hello案例

    1.导入jar包 commons-logging-1.1.1.jar jackson-annotations-2.5.4.jar jackson-core-2.5.4.jar jackson-data ...

  8. python基础学习(一) 第一个python程序

    1. 使用python/python3解释器的方式 按照惯例,我们都是以Hello world作为一门程序语言的开始,进行如下的操作: 在桌面上新建一个hello-python文件夹 进入hello- ...

  9. Hibernate入门(一)

    1.导包 导入Hibernate最基本的包(不要忘记导入数据库驱动包了!) 下载文件名为黄色框框中的名称的压缩包在对应路径下,有个required包下的所有包就是必备的基本包 2.建表 USE TES ...

  10. 面试官:你分析过mybatis工作原理吗?

    Mybatis工作原理也是面试的一大考点,必须要对其非常清晰,这样才能怼回去.本文建立在Spring+SpringMVC+Mybatis整合的项目之上. 我将其工作原理分为六个部分: 读取核心配置文件 ...