作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用。此时,你需要尽快侦测和处理这类问题。

死锁是当两个或者以上的事务互相阻塞引起的。在这种情况下两个事务会无限期地等待对方释放资源以便操作。下面是死锁的示意图:

本文将使用SQLServer Profiler来跟踪死锁。

准备工作:

为了侦测死锁,我们需要先模拟死锁。本例将使用两个不同的会话创建两个事务。

步骤:

1、 打开SQLServer Profiler

2、 选择【新建跟踪】,连到实例。

3、 然后选择【空白】模版:

4、 在【事件选择】页中,展开Locks事件,并选择以下事件:

1、 Deadlock graph

2、 Lock:Deadlock

3、 Lock:Deadlock Chain

5、 然后打开TSQL事件,并选择以下事件:

1、 SQL:StmtCompleted

2、 SQL:StmtStarting

6、 点击【列筛选器】,在跟踪属性中,选择数据库名为需要侦测的数据库,这里使用AdventureWorks。

7、 在【组织列】中,调整顺序,如下:

8、 点击运行。

9、 然后打开SQLServer,并打开两个连接。

10、 在第一个窗口中输入并执行下面脚本:

  1. USE AdventureWorks
  2. GO
  3. SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
  4. GO
  5. BEGIN TRANSACTION
  6. SELECT  *
  7. FROM    Sales.SalesOrderDetail
  8. WHERE   SalesOrderDetailID = 121316

11、 然后在第二个窗口中输入并执行下面脚本:

  1. USE AdventureWorks
  2. GO
  3. SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
  4. BEGIN TRANSACTION
  5. SELECT  *
  6. FROM    Sales.SalesOrderDetail
  7. WHERE   SalesOrderDetailID = 121317

12、现在回到第一个窗体,并运行下面的脚本:

  1. UPDATE Sales.SalesOrderDetail
  2. SET OrderQty=2
  3. WHERE SalesOrderDetailID=121317

13、在第二个窗口输入下面语句:

  1. UPDATE Sales.SalesOrderDetail
  2. SET OrderQty=2
  3. WHERE SalesOrderDetailID=121316

14、 然后在第二个窗口就会看到下面的消息:

15、切换到SQLServer Profiler,可以看到下面的截图:

16、 点击【Deadlock graph】时间,会显示死锁的图像:

17、可以保存死锁图像,右键然后选择导出事件数据,并另存为xdl文件:

下面是其XML格式:

分析:

在本文中,首先创建一个Profiler空白模版,然后选择下面的事件进行监控:

1、 Deadlock graph

2、 Lock:Deadlock

3、 Lock:Deadlock Chain

4、 SQL:StmtCompleted

5、 SQL:StmtStarting

然后通过限定数据库,来限制监控过得对象范围。

在配置好之后,运行跟踪,并在ssms中运行脚本。SQLServer会自动处理和侦测这种类型的死锁。然后会在第二个窗体中收到1205的错误。

在SQLServer Profiler中,演示了如何收集死锁事件,在跟踪结果中可以看到两个事务尝试在一个拥有共享锁的键上添加排它锁。通过死锁图像,可以看到死锁发生的细节。

为了避免或者最小化死锁的发生,有一些建议可以参考:

1、 确保你的事务尽可能地小,这里指范围。

2、 使用较低隔离级别的事务。

3、 对于可能的查询,使用NOLOCK查询提示。

4、 规范化数据库设计。

5、 在需要的列上创建索引,以便是表不需要经常扫描,减少锁问题的发生。

6、 控制数据库对象访问的顺序是相同的顺序。

ps:我用了这个例子,结果没出现死锁,用下面这个例子可以:

在一个窗口输入以下语句:

BEGIN TRAN

USE TEST;

UPDATE T6 SET time3='2013-12-31 00:00:00.000'

WHERE time3='9999-09-09 00:00:00.000'

WAITFOR DELAY '0:0:15'

UPDATE T3 SET VALUE=5

WHERE ID=10

COMMIT TRAN

在另一个窗口输入以下语句:

BEGIN TRAN

USE TEST;

UPDATE T3 SET VALUE=5

WHERE ID=10

WAITFOR DELAY '0:0:15'

UPDATE T6 SET time3='2013-12-31 00:00:00.000'

WHERE time3='9999-09-09 00:00:00.000'

COMMIT TRAN

在第一个窗口执行后,在15秒之内执行第二个窗口的查询。

会发生死锁。

事务的执行过程:

①:窗口1要更新T6的数据,需要向数据库引擎申请T6的排他锁。

②:窗口2要更新T3的数据,需要向数据库引擎申请T3的排他锁。

因为请求锁的对象不同,所以它们可以同时得到想要的锁。

③:在窗口2还没有完成对T3更新前,窗口1完成了对T6的更新,然后想要更新T3的数据,此时需要请求T3的排他锁。由于排他锁与窗口2上面的T3上面的排他锁不兼容,所以窗口1必须等待窗口2执行完事务,然后放在T3上面的排他锁后,才能获得对T3的排他锁。

④:窗口2想要申请T6上的排他锁同上面道理一样。

双方都等待对方释放资源,才能继续事务操作,从而形成死锁。

例子中使用WAITFOR语句在执行两条语句间休息5秒,可以增加死锁的概率。

数据库引擎会定期检索死锁,一旦发现问题,会选取其中一个事务作为牺牲品,终止事务的运行,从而释放资源。

被牺牲的事务会显示如下信息:

(1 行受影响)

消息 1205,级别 13,状态 45,第 7 行

事务(进程 ID 55)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

‘1行受影响’表示第一个UPDATE语句已经执行成功。但是由于事务没有成功提交,所以回滚掉了。

本篇文章转自:

http://blog.csdn.net/dba_huangzj/article/details/8697600

使用 SQL SERVER PROFILER 监测死锁的更多相关文章

  1. Sql Server Profiler跟踪死锁

    Sql Server Profiler一个很重要的应用场景就是监视分析死锁. 下面通过一个例子来学习Profiler是如何监视死锁的. 1. 创建测试数据模拟死锁, 创建表Table_A和Table_ ...

  2. SQL Server Profiler监控SQL Server性能

    全面掌握SQL Server Profiler 1.       原理与相关概念介绍 SQL Server Profiler,大家已经非常熟悉.常常在性能优化中使用,本文档详细介绍SQL Server ...

  3. SQL Server Profiler的简单使用

    SQL Server Profiler可以检测在数据上执行的语句,特别是有的项目不直接使用sql语句,直接使用ORM框架的系统处理数据库的项目,在调试sql语句时,给了很大的帮助. 之前写了使用SQL ...

  4. SQL Server Profiler的简单使用(监控mssql)

    SQL Server Profiler可以检测在数据上执行的语句,特别是有的项目不直接使用sql语句,直接使用ORM框架的系统处理数据库的项目,在调试sql语句时,给了很大的帮助. 之前写了使用SQL ...

  5. SQL2005 : 如何在SQL Server Profiler (事件查看器)中 跟踪查看死锁恢复

    SQL Profiler 通过 SQL Profiler 工具程序,可监控应用程序如何访问数据库引擎.普通来说,当系统性能需要优化或是应用程序对数据库访问的结果不合预期,都可以使用该工具确认视图问题所 ...

  6. 通过SQL Server Profiler来监视分析死锁

    在两个或多个SQL Server进程中,每一个进程锁定了其他进程试图锁定的资源,就会出现死锁,例如,进程process1对table1持有1个排它锁(X),同时process1对table2请求1个排 ...

  7. 数据库性能监测工具——SQL Server Profiler

    使用SQL Server Profiler 进行sql监控需要一些设置: 其他的就是进行分析了~ 清除SQL SERVER缓存 常用的方法: DBCC DROPCLEANBUFFERS 从缓冲池中删除 ...

  8. Sql性能检测工具:Sql server profiler和优化工具:Database Engine Tuning Advisor

    原文:Sql性能检测工具:Sql server profiler和优化工具:Database Engine Tuning Advisor 一.工具概要     数据库应用系统性能低下,需要对其进行优化 ...

  9. SQL Server Profiler

    一.SQL Profiler工具简介 SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询: 在后台收集查询信息: 分析性能: 诊断像死锁之类的问 ...

随机推荐

  1. POJ - 3735 循环操作

    构造n+1元组,m次方的矩阵代表循环操作 本题尚有质疑之处(清零操作的正确性还有单位矩阵的必要性),题解可能会改正 #include<iostream> #include<algor ...

  2. B - Toy Storage(POJ - 2398) 计算几何基础题,比TOYS多了个线段排序

    Mom and dad have a problem: their child, Reza, never puts his toys away when he is finished playing ...

  3. Apache Shiro(二)-登录认证和权限管理数据库操作

    数据库支持 在上一篇中使用ini 配置文件进行了相关权限数据的配置. 但是实际工作中,我们都会把权限相关的内容放在数据库里. 所以本知识点讲解如何放在数据库里来撸. RBAC 概念 RBAC 是当下权 ...

  4. PhpExcel中文帮助手册|PhpExcel使用方法 ( 后面有部分没有显示出来 可以编辑中看到!!)

    下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...

  5. Linux总线设备驱动模型

    1. Linux2.6内核引入总线.设备.驱动模型来描述各种总线(PCI.USB.I2C.SPI)与外围设备及其驱动之间的关系. 2. 在Linux内核中,总线用bus_type结构来描述,定义于文件 ...

  6. Android百分比布局方案

    百分比布局让其中的控件在指定高度,宽度,margin时使用屏幕宽高的百分比,不使用dp,px.这样一套布局可以适应多个屏幕,方便适配.如: app:layout_heightPercent=" ...

  7. CI 框架中的日志处理 以及 404异常处理

    最近在整理项目中的日志问题,查了一些关于 “CI 框架中的日志处理 以及 404异常处理” 的东西,顺便记录一下: 关于错误日志: 1. 在CI框架中的 system/core/CodeIgniter ...

  8. linux运维基础知识

    linux运维基础知识大全 一,序言 每一个微不足道的知识,也是未来的铺垫.每一份工作的薪资职位,也是曾经努力的结果. 二,服务器 1,运维人员工作职责: 1)保证数据不丢失:2)保证服务器24小时运 ...

  9. WPF 父子窗体联动

    问题: 近段时间,由于项目上的一些原因,设计到在WPF项目使用引用COM组件的问题,部分WPF元素浮动在COM组件之上,并且实现拖.停靠.放大等功能(子窗体不要求等比缩放,只要位置跟随主窗体即可),如 ...

  10. 【Linux相识相知】文本处理工具之grep\egrep\fgrep及正则表达式

    常说Linux上有文本处理的三剑客,grep.sed和awk,本文就grep做出详细的描述,并引出正则表达式. grep NAME:打印模式匹配的行 SYNOPISIS: grep [OPTIONS] ...