准备工作:

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

步骤:

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、 控制数据库对象访问的顺序是相同的顺序。

最新文章

  1. css元素水平居中和垂直居中的方式
  2. #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案
  3. URL中文转码问题
  4. 在Linux最小系统上编译运行第一个helloworld程序
  5. 26数据查询的各种小玩法-select 下(必学)-天轰穿sqlserver视频教程
  6. hdu1078 记忆化搜索
  7. 01-03-02-1【Nhibernate (版本3.3.1.4000) 出入江湖】CRUP操作--cascade 级联相关
  8. Bitwise AND of Numbers Range——LeetCode
  9. js 控制不能输入空格
  10. IE6浏览器的一些问题
  11. 清空jQuery validation 显示的错误信息
  12. CCF系列之最优灌溉(201412-4)
  13. 前端笔记之ES678&Webpack&Babel(中)对象|字符串|数组的扩展&函数新特性&类
  14. MSP430F149串口收发程序的学习(一)
  15. scala的多种集合的使用(5)之数组Array(ArrayBuffer)的操作
  16. 013 mysql中find_in_set()函数的使用
  17. Netty+MUI从零打造一个仿微信的高性能聊天项目,兼容iPhone/iPad/安卓
  18. 20145307陈俊达《网络对抗》Exp7 网络欺诈技术防范
  19. Go语言的传参和传引用[转]
  20. 数据结构与算法 —— 链表linked list(06)

热门文章

  1. Change Tracking of SQLServer
  2. C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?
  3. Python模块(pickle)
  4. 从 Vue 1.x 迁移
  5. Http authentication(BASIC, DIGEST)
  6. c# 工具
  7. 《30天自制操作系统》07_day_学习笔记
  8. switch为什么不能用string类型?
  9. PostgreSQL Replication之第十二章 与Postgres-XC一起工作(7)
  10. ORACLE 12C PDB 维护基础介绍