最近看了高兄的一篇文章,Sql Server 高频,高并发访问中的键查找死锁解析,很有收获,里面讲到了键查找引起的死锁问题。
当然看的过程中,其实自己有个疑问:
对于键查找这类查询,会申请哪些锁,锁申请和释放的顺序是怎样的?
 
准备
备注:测试表仍然使用高兄文中创建的测试表testklup
在开始之前,使用dbcc ind 命令先看下测试表的数据组织情况
然后语句执行计划图如下:
 
查看申请了哪些锁
 
为了得到查询会申请哪些锁,通过如下这条查询就可以得到
begin tran
select cont2 from testklup with(HOLDLOCK) where nlskey=1

在默认的事务隔离级别下,开启事务,然后查询中使用HOLDLOCK提示。HOLDLOCK将共享锁保留到事务完成,而不是在相应的表、行或数据页不再需要时就立即释放锁。

然后使用DMV视图sys.dm_tran_locks来查看持有锁的情况,查询结果如下:

从查询结果,可以得出申请了如下的锁:
1)在表object上申请了IS锁
2)在非聚集索引PAGE上申请了IS锁
3)在非聚集索引KEY上申请了S锁
4)在聚集索引的PAGE上申请了IS锁
5)在聚集索引的KEY上申请了S锁
 
查看锁申请和释放的顺序
 
我们使用SQL Profiler来跟踪锁申请和释放的事件。
备注:也可以在执行语句前,开启1200跟踪标记,使用语句dbcc traceon(1200,-1) (感谢CareySon)
模板选择TSQL-LOCKS,只跟踪运行语句的会话spid,同时事件增加Lock:Acquired和Lock:Released。执行查询跟踪结果如下:
 
从上图可以得出如下信息:
1) 非聚集索引申请的S锁需等到键查找在聚集索引上查找完毕后才释放。这其实也是键查找导致死锁发生的条件
2)锁申请和释放的顺序有点类似于进栈和出栈,先申请的最后释放
3)疑问:为什么没有键查找在聚集索引Key上申请的S锁记录呢?锁肯定是有,但不清楚为什么Profiler没有记录到,因为我跟踪查询加HOLD时,是会在最后申请一个S锁的,结果如下:
 
 
小结
通过本文,我们知道了一个简单的键查找查询会申请哪些锁,同时,锁申请和释放的顺序是怎样的。在非聚集索引上申请的锁一直到键查找执行完毕才会释放 
 
如有不对的地方,欢迎拍砖,谢谢!O(∩_∩)O 
 

SQLServer 查询使用键查找时锁申请及释放顺序的更多相关文章

  1. SQL Server查询使用键查找时锁申请及释放顺序

    当然看的过程中,其实自己有个疑问: 对于键查找这类查询,会申请哪些锁,锁申请和释放的顺序是怎样的? 准备 备注:测试表仍然使用高兄文中创建的测试表testklup 在开始之前,使用dbcc ind 命 ...

  2. 追踪SQL Server执行delete操作时候不同锁申请与释放的过程

    一直以为很了解sqlserver的加锁过程,在分析一些特殊情况下的死锁之后,尤其是并发单表操作发生的死锁,对于加解锁的过程,有了一些重新的认识,之前的知识还是有一些盲区在里面的.delete加锁与解锁 ...

  3. SqlServer查询语句中用到的锁

    前段时间**公司DBA来我们这培训.讲了一大堆MYSQL的优化. QA环节一程序员问“SQL语句中的 with nolock 除了不锁表外,是否能读其他锁住的数据". 讲课的人嘟嘟了半天没解 ...

  4. ql Server 高频,高并发访问中的键查找死锁解析

    死锁对于DBA或是数据库开发人员而言并不陌生,它的引发多种多样,一般而言,数据库应用的开发者在设计时都会有一定的考量进而尽量避免死锁的产生.但有时因为一些特殊应用场景如高频查询,高并发查询下由于数据库 ...

  5. Sql Server 高频,高并发访问中的键查找死锁解析

    死锁对于DBA或是数据库开发人员而言并不陌生,它的引发多种多样,一般而言,数据库应用的开发者在设计时都会有一定的考量进而尽量避免死锁的产生.但有时因为一些特殊应用场景如高频查询,高并发查询下由于数据库 ...

  6. 【转载】看懂SqlServer查询计划

    看懂SqlServer查询计划 阅读目录 开始 SQL Server 查找记录的方法 SQL Server Join 方式 更具体执行过程 索引统计信息:查询计划的选择依据 优化视图查询 推荐阅读-M ...

  7. 看懂SqlServer查询计划

    看懂SqlServer查询计划 阅读目录 开始 SQL Server 查找记录的方法 SQL Server Join 方式 更具体执行过程 索引统计信息:查询计划的选择依据 优化视图查询 推荐阅读-M ...

  8. day44——索引、explain、慢查询、数据备份、锁、事务

    day44 索引介绍 为何要有索引? ​ 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还有一些复杂的查询操作 ...

  9. 看懂SqlServer查询计划【转】

    原文链接:http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html 开始 SQL Server 查找记录的方法 SQL Server ...

随机推荐

  1. python独立环境——virtualenv

    安装: pip3 intall virtualenv   创建独立运行环境: 1. 进入项目文件夹根目录 2. 创建环境 Mac:myproject michael$ virtualenv --no- ...

  2. Android中的各种访问权限Permission含义

    android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android. ...

  3. InterView之PHP2

    PHP 理论知识 常用的超全局变量(8个) $_GET ----->get传送方式 $_POST ----->post传送方式 $_REQUEST ----->可以接收到get和po ...

  4. The version of SOS does not match the version of CLR you are debugging; SOS.dll版本不匹配; Dump文件不同环境mscordacwks.dll版本问题

    The version of SOS does not match the version of CLR you are debugging 和 PDB symbol for clr.dll not ...

  5. layer相关使用

    父子页面传参数 转自:https://blog.csdn.net/babyxue/article/details/76854106 1.父页面打开子页面并向子页面传参数 function setCho ...

  6. mysql/mariadb 数据库配置

    1.  启动mariadb systemctl start mariadb 2. 设置开机启动mariadb systemctl enable mariadb 一.修改用户密码,以root为例 1. ...

  7. springboots 配置文件

    1.build.gradle buildscript { // 声明变量 ext { springBootVersion = '1.5.2.RELEASE' } // 仓库 repositories ...

  8. resize定义元素尺寸大小

    为了增强用户体验,CSS3增加了很对的新属性,其中一个重要的属性就是resize,它允许用户通过拖动的方式改变元素的尺寸,到目前为止,主要用于可以使用overtflow属性的任何容器元素中 resiz ...

  9. xcode 调试器 LLDB

    本文完全转载,转载地址:点击这里 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函 ...

  10. UIWebView 展示GIF/image

    代码: [web loadData:self.gifDataArr[index] MIMEType:@"image/gif" textEncodingName:@"&qu ...