最近看了高兄的一篇文章,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. 在CentOS上装Redis

    Redis官网 $ wget http://download.redis.io/releases/redis-3.2.5.tar.gz $ tar xzf redis-.tar.gz $ cd red ...

  2. mysql 操作符

    1 mysql 操作符 下图表示所有操作符的执行优先级,从高到低,同一行中的操作符优先级相同,相同优先级的情况则从左到右执行 如果想改变优先级执行顺序则可以使用括号() 1.1 对比操作符 对比操作符 ...

  3. 从n个字符中,找出m个排列组合

    #include <string.h> #include <stdio.h> #include <stdlib.h> void combine(char *valu ...

  4. 转:Java8内存模型—永久代(PermGen)和元空间(Metaspace)

    一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是一种叫“栈 ...

  5. java.lang.NoSuchMethodError: org.json.JSONArray.iterator()Ljava/util/Iterator 阿里云短信

    请尝试使用 <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk ...

  6. haproxy 学习记录

    1.简易安装 make TARGET=linux26 prefix=/usr/local/haproxy install 启动haproxy在sbin目录,其余的在doc目录 2. 配置 hdr_be ...

  7. Eclipse编辑JS响应慢,复制粘贴卡顿的解决方案

    我使用的是官网标准版的eclipse4.3 for javaEE, 写JS时卡的简直无法忍受,尝试去掉所有的validate,包括菜单和项目属性中的都没作用. 整个人都急疯了~ 后来在项目根目录.pr ...

  8. Android开发关闭虚拟按钮、底部导航条

    在Android开发中,遇到了一系列大大小小的问题,其中一个就是屏蔽底部实体键,我找了很多的博客也尝试了许许多多的方法,但始终不能屏蔽 HOME键,后来看见一篇博客说在Android 4.0以后,屏蔽 ...

  9. bind9配置转发服务

    修改bind主配置文件 $ vi /etc/named.conf//// named.conf//// Provided by Red Hat bind package to configure th ...

  10. ASPxPopupControl出现前一次弹框页面解决方法

    设置关闭事件 <ClientSideEvents  CloseUp="CloseUp" /> function CloseUp(s, e) {    s.SetCont ...