当同个对象上有互斥的锁存在时,查询需要等待很长时间,我们是否可以收到来自SQL Server提醒?答案是可以的,做法非常简单,因为SQL Server为你提供了称为Blocked Process Report 的功能。很可惜这个功能默认是未启用的。因此这篇文章我想给你讲解下Blocked Process Report 的大致用法,当SQL Server出现锁时,你可以用它来做的进一步的故障排除。

Blocked Process Report本身是个简单的事件,你可以通过SQL Server Profiler或SQL Traces跟踪。这个事件被称为Blocked Process Report,你可以在Errors and Warnings事件组里找到它:

但那个事件只被突出(跟踪),当你通过sp_configure选项指定blocked process threshold阀值在SQL Server实例级别启用Blocked Process Report 功能时。那个参数只接收0到86400的数字,查询必须要等到锁持久的秒数后,SQL Server才会生成Blocked Process Report事件。默认情况下那个配置选项值为0,就是这个事件不会触发。下面的代码设置阀值为10秒钟:

 sp_configure 'blocked process threshold', 10
RECONFIGURE
GO

为了演示Blocked Process Report,我通过一个UPDATE语句在AdventureWorks2008R2数据库内部创建一个新的事务:

 BEGIN TRANSACTION

 UPDATE Person.Person
SET Title = 'Mr'
WHERE BusinessEntityID = 1

在这个语句执行后,这个查询现在需要在列BusinessEntityID值等于1的记录上获得一个排它锁(Exclusive Lock (X))。在第2个会话现在我尝试读取同样的记录。在读取期间,SQL Server尝试获取一个共享锁(Shared Lock (S)),这就导致了阻塞情形:

 SELECT * FROM Person.Person
WHERE BusinessEntityID = 1
GO

当你启动SQL Server Profiler且配置了Blocked Process Report事件,在10秒后,你就会看这个被报告:

从上图可以看到,Blocked Process Report 本身就是一个XML数据,因此很容易对它进一步分析,如果你对XML和XQuery熟悉的话。

 <blocked-process-report>
<blocked-process>
<process id="process35ab1c8" taskpriority="0" logused="0" waitresource="KEY: 11:72057594045333504 (8194443284a0)" waittime="16986" ownerId="49004" transactionname="SELECT" lasttranstarted="2015-06-23T14:09:38.900" XDES="0x5f02138" lockMode="S" schedulerid="1" kpid="8512" status="suspended" spid="55" sbid="0" ecid="0" priority="0" trancount="0" lastbatchstarted="2015-06-23T14:09:38.900" lastbatchcompleted="2015-06-23T14:09:10.877" lastattention="2015-06-23T14:09:10.877" clientapp="Microsoft SQL Server Management Studio - 查询" hostname="WXGFZCXXZX81-18" hostpid="4492" loginname="sa" isolationlevel="read committed (2)" xactid="49004" currentdb="11" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200">
<executionStack>
<frame line="1" stmtstart="24" sqlhandle="0x020000006063873a3a5f7e72ad0b55e66df822bf70e6f14c"/>
<frame line="1" sqlhandle="0x0200000066bba411d9c6966611de8194e81441d7836a9554"/>
</executionStack>
<inputbuf>
SELECT * FROM Person.Person
WHERE BusinessEntityID = 1
</inputbuf>
</process>
</blocked-process>
<blocking-process>
<process status="sleeping" spid="57" sbid="0" ecid="0" priority="0" trancount="3" lastbatchstarted="2015-06-23T14:09:36.050" lastbatchcompleted="2015-06-23T14:09:36.050" clientapp="Microsoft SQL Server Management Studio - 查询" hostname="WXGFZCXXZX81-18" hostpid="4492" loginname="sa" isolationlevel="read committed (2)" xactid="47048" currentdb="11" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200">
<executionStack/>
<inputbuf>
BEGIN TRANSACTION UPDATE Person.Person
SET Title = &apos;Mr&apos;
WHERE BusinessEntityID = 1 </inputbuf>
</process>
</blocking-process>
</blocked-process-report>

XML数据里有2个重要节点– <blocked-process><blocking-process>。第1个– <blocked-process>描述阻塞的会话。在这里是对AdventureWorks2008R2执行SELECT语句查询的会话。这里最重要的是waitresource的XML属性,它包含会话上等待的锁资源,超过了blocked process threshold 配置选项

第2个<blocking-process>描述当前在资源上持互斥锁的会话,在这个资源上其他会话需要获取锁。这里最重要的是<inputbuf>的XML元素,它显示了SQL 语句需要的互斥锁。手上有了这些信息,就很容易进一步进行故障排除,就是为什么阻塞阀值被超出,还有下一步对它如何处理(这里的会话是一个孤立的事务(orphaned transaction),杀掉了其他会话)。

当你使用Blocked Process Report时,你需要记住的最重要的是,SQL Server值为你生成对应的XML报告,不会为你解决锁/死锁。这就是,在生成Blocked Process Report后,SELECT语句的会话还是继续运行——SQL Server这里不会杀掉这个会话——SQL Server只报告有个会话超过了blocked process threshold——剩下的一切都还是要你自己去处理。

参考文章:

https://www.sqlpassion.at/archive/2011/12/01/the-blocked-process-report/

Blocked Process Report的更多相关文章

  1. 如何使用Profiler跟踪阻塞信息

    Blocked Process ReportProfiler提供一个被阻塞进程报告的事件Errors and Warnings->Blocked Process Report 指示某个任务已被阻 ...

  2. SQL Server中关于跟踪(Trace)那点事

    前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...

  3. The Accidental DBA

    The Accidental DBA (Day 1 of 30): Hardware Selection: CPU and Memory Considerations 本文大意:      全篇主要讲 ...

  4. 【转】SQL Server中关于跟踪(Trace)那点事

    前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...

  5. [翻译]:SQL死锁-阻塞探测

    到了这篇,才是真正动手解决问题的时候,有了死锁之后就要分析死锁的原因,具体就是需要定位到具体的SQL语句上.那么如何发现产生死锁的问题本质呢?下面这篇讲的非常细了,还提到了不少实用的SQL,但对我个人 ...

  6. SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events

    由于工作需要,决定深入研究SQL Server的扩展事件(Extended Events/xEvents),经过资料搜索,发现国外大牛的系列文章,作为“学习”阶段,我先翻译这系列文章,后续在工作中的心 ...

  7. 【译】The Accidental DBA:Troubleshooting

    最近重新翻看The Accidental DBA,将Troubleshooting部分稍作整理,方便以后查阅.此篇是Part 3Part 1:The Accidental DBA:SQL Server ...

  8. 一个特殊的SQL Server阻塞案例分析

    上周,在SQL Server数据库下面遇到了一个有意思的SQL阻塞(SQL Blocking)案例.其实个人对SQL Server的阻塞还是颇有研究的.写过好几篇相关文章. 至于这里为什么要总结一下这 ...

  9. SQL Server中关于跟踪(Trace)那点事(转载)

    前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...

随机推荐

  1. React同构直出原理浅析

    通常,当客户端请求一个包含React组件页面的时候,服务端首先响应输出这个页面,客户端和服务端有了第一次交互.然后,如果加载组件的过程需要向服务端发出Ajax请求等,客户端和服务端又进行了一次交互,这 ...

  2. Imagick总结及反思

    2014-08-23 今天安装Imagick出现了很多问题,自己也有些着急,以下为各版本信息: ImageMagick: 安装版本:ImageMagick-6.5.8-Q16 安装目录:E:/PHPS ...

  3. jackson readTree

    String jsonstr = "{\"msg\":{\"head\":{\"version\":\"1.0\&quo ...

  4. int跟byte[]数组互转的方法,整数 + 浮点型

    整数: int转byte数组 public static byte[] intToBytes2(int n){ ]; ;i < ;i++) { b[i]=(-i*)); } return b; ...

  5. centos7 linux 安装jdk8

    1.下载64位jdk8 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.在 ...

  6. Android ImageView src与backgroud

    在XML中添加ImageView时,有两个可以设置图片的地方,一个是android:src,一个是android:background,这两个的区别: src是图片内容,显示在前面的,backgrou ...

  7. 无须任何软件配置iis+ftp服务器图文说明

    1.1 检查是否安装已安装IIS6组件 在windows service 2003 操作系统中,windows组件“IIS6.0”是用户搭建站点以及ftp文件共享的服务器. 具体检查步骤如下: 进入“ ...

  8. floor相关

    select floor(@f*0.22) -- 直接可显示结果 create table demo( id ,), id1 int ) select * from demo insert into ...

  9. 常用的Expression调用形式

    ConstantExpression exp1 = Expression.Constant();构建常量表达式(还可以加类型) BinaryExpression exp12 = Expression. ...

  10. [leetcode]Rotate Array

    in place交换 如果是k步,那么就是把后面k个放到前面了嘛. 我们先把整个数组reverse,然后把前面的reverse回来,再把后面的reverse回来 对于AB我们要通过reverse操作得 ...