本例中使用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. Chrome 浏览器最牛插件之一 Vimium

    导航当页: ? 显示help,查询vimium的所有使用方法 h 向左滚动 j 向下滚动 k 向上滚动 l 向右滚动 gg 滚动到顶部 G 滚动到底部 d 向下滚动半页 u 向上滚动半页面 f 显示链 ...

  2. kubelet集群网络配置flannel(覆盖网络)

    kubernetes本身并不会对跨主机容器的网络进行设置,这需要额外的工具来实现.一些常用的开源工具主要包括flanne.OpenvSwitch.Weave.Calico等,这里面最常用的是flann ...

  3. Java设计模式之《构建者模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6553374.html 构建者模式,又称建造者模式,将一部负责对象的构建分为许多小对象的构建 ...

  4. #21 Python异常

    前言 运行程序时经常遇到各种错误,例如:ImportError(导入模块错误).IndexError(索引错误).NameError(变量错误).SyntaxError(语法错误).Indentati ...

  5. sql-索引的作用(超详细)

    (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonc ...

  6. OKR20180607

    OKR---目标与关键成果法 一套明确和跟踪目标及其完成情况的管理工具和方法 OKR的主要目标是明确公司和团队的“目标”以及每个目标达成的可衡量的“关键结果”. “目标”是设定一个定性的时间目标.“关 ...

  7. 什么是xss攻击,如何预防(初级)?

    概念: XSS(Cross Site Scripting),即跨站脚本攻击,是一种常见于web应用程序中的计算机安全漏洞.XSS通过在用户端注入恶意的可运行脚本,若服务器端对用户输入不进行处理,直接将 ...

  8. WORLD 目录排版调整

    文本如下: ----------------------------------------------------------------- 前言1 简介2 我爱你3 圣灵丹方士大夫4 阿类似的看风 ...

  9. ASPxGridView 添加勾选列--全选 和 后端获取勾的行ID

    一.HTML 代码 <table style="width: 100%;"> <tr> <td> <asp:Button ID=" ...

  10. JavaScript 基础(四) - HTML DOM Event

    HTML DOM Event(事件) HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript.下 ...