最近写程序常会遇到deadlock victim,每次一脸懵逼。研究了下怎么跟踪,写下来记录下。

建测试数据

  1. CREATE DATABASE testdb;
  2.  
  3. GO
  4.  
  5. USE testdb;
  6.  
  7. CREATE TABLE table1
  8. (
  9. id INT IDENTITY PRIMARY KEY,
  10. student_name NVARCHAR(50)
  11.  
  12. )
  13.  
  14. INSERT INTO table1 values ('James')
  15. INSERT INTO table1 values ('Andy')
  16. INSERT INTO table1 values ('Sal')
  17. INSERT INTO table1 values ('Helen')
  18. INSERT INTO table1 values ('Jo')
  19. INSERT INTO table1 values ('Wik')
  20.  
  21. CREATE TABLE table2
  22. (
  23. id INT IDENTITY PRIMARY KEY,
  24. student_name NVARCHAR(50)
  25.  
  26. )
  27.  
  28. INSERT INTO table2 values ('Alan')
  29. INSERT INTO table2 values ('Rik')
  30. INSERT INTO table2 values ('Jack')
  31. INSERT INTO table2 values ('Mark')
  32. INSERT INTO table2 values ('Josh')
  33. INSERT INTO table2 values ('Fred')

第一段sql,先运行只更新table1部分

  1. USE testdb;
  2.  
  3. -- Transaction1
  4. BEGIN TRAN
  5.  
  6. UPDATE table1
  7. SET student_name = student_name + 'Transaction1'
  8. WHERE id IN (1,2,3,4,5)
  9.  
  10. UPDATE table2
  11. SET student_name = student_name + 'Transaction1'
  12. WHERE id = 1
  13.  
  14. COMMIT TRANSACTION

第二段sql,只运行更新table2部分

  1. USE testdb;
  2.  
  3. -- Transaction2
  4. BEGIN TRAN
  5.  
  6. UPDATE table2
  7. SET student_name = student_name + 'Transaction2'
  8. WHERE id = 1
  9.  
  10. UPDATE table1
  11. SET student_name = student_name + 'Transaction2'
  12. WHERE id IN (1,2,3,4,5)
  13.  
  14. COMMIT TRANSACTION

  再运行,第一段sql更新table2,运行第二段sql更新table1,死锁问题重现。

说下跟踪死锁的方法:

1.使用trace log跟踪,执行如下sql开启1222和1204 flag,死锁信息会在sql server 日志中输出。

  1. DBCC TRACEON (1204, -1)
  2. DBCC TRACEON (1222, -1)

下图是1204输出的信息

下图是1222输出的信息

2.使用sql server profiler进行跟踪

点击Tools -> sql server profiler 选择sql locks模板

运行当发生死锁时会自动捕获,点击dead lock paragraph查看死锁

3.使用扩展事件跟踪,方法只适用于sql server 2012版本,08r2版本无法直接使用。

依次点击Management -> Extended Events - >system health - >package0.event_file

输入deadlock回车,可以点击details 把内容另存为xdl文件再打开,或点击deadlock查看图

4.使用windows性能计数器检测到死锁再去sql中查询

命令行输入:perfmon  或者 perfmon /sys

选择实例:SQL Server :Locks \\  Number of DeadLocks/sec \\ _Total

实时查看:

下面的查询提供了自从上次重启以来在本服务器上发生的所有死锁:

SELECT cntr_value AS NumOfDeadLocks

FROM sys.dm_os_performance_counters

WHERE object_name = 'SQLServer:Locks'

AND counter_name = 'Number of Deadlocks/sec'

AND instance_name = '_Total'

sql server deadlock跟踪的四种方法的更多相关文章

  1. SQL Server 优化存储过程的七种方法

    原文:SQL Server 优化存储过程的七种方法 优化存储过程有很多种方法,下面介绍最常用的7种. 1.使用SET NOCOUNT ON选项 我们使用SELECT语句时,除了返回对应的结果集外,还会 ...

  2. SQL Server遍历表的几种方法 转载

    SQL Server遍历表的几种方法 阅读目录 使用游标 使用表变量 使用临时表 在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易 ...

  3. 【2017-03-09】SQL Server 数据库基础、四种约束

    一.数据库和内存的区别 数据库:一些存储在硬盘上的数据文件 内存:计算机临时存储的一些数据 二.常用数据库 .Net - SQL Server PHP - MySql Java - Oreacl 三. ...

  4. SQL Server 创建索引的 5 种方法

    前期准备: create table Employee (            ID int not null primary key,            Name nvarchar(4),  ...

  5. 查看sql server数据库连接数的三种方法

    怎样才能查看sql server数据库连接数呢?下面就将为您介绍三种查看的方法,供您参考,希望能够帮助到您. 1.通过系统的“性能”来查看:开始->管理工具->性能(或者是运行里面输入 m ...

  6. SQL Server遍历表的几种方法

    在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易懂,但是它不符合面向集合操作的原则,而且性能也比面向集合低.当然,从面向集合操作的 ...

  7. SQL Server 索引重建的 4 种方法

    解决方法 方法 1. 重建指定索引,这种方法没有性能可谈.重建时表还不可访问. 方法 2. 在线重建索引,只有SQL Server 企业版才支持. 方法 3. 使用填充因子重建,这样做不一定可以减小查 ...

  8. sql server列转行的几种方法

    方法一,临时变量: declare @temp nvarchar(max)='' select @temp=coalesce(@temp,'')+Location+',' from( select d ...

  9. SQL server分页的四种方法

    SQL server分页的四种方法 1.三重循环: 2.利用max(主键); 3.利用row_number关键字: 4.offset/fetch next关键字 方法一:三重循环思路  先取前20页, ...

随机推荐

  1. 百度地图InfoWindow弹窗圆角

    效果如下 使用CSS样式 /*地图标题*/ .BMap_pop div:nth-child(1) div { border-radius: 8px 0 0 0; } .BMap_pop div:nth ...

  2. windows10下笔记本电脑外接显示器设置

    笔记本屏幕小,故外接一个显示器,方便使用. 我的电脑没有VGA接口,有HDMI接口,所以我买了一个HDMI到VGA接口转换器. 直接把外界显示器安装到笔记电脑上,如下图所示 接下来是屏幕设置 打开系统 ...

  3. Java实现验证码的产生和验证

    大家都知道为了防止我们的网站被有些人和黑客恶意攻击,比如我们网站的注册页面,如果我们在用户注册的时候不加上一个验证码框的话,别人就可以写一个脚本对你的网站进行恶意的注册,比如每分钟对你的网站进行n次的 ...

  4. grpc protobuf

    1.ProtoBuffer是google的一款非常高效的数据传输格式框架 2.一个方法仅能接受一个参数 3.对于定义的message,每个值都有一个唯一的number类型的数字,根据官方文档的解释:它 ...

  5. http://www.cnblogs.com/linxiyue/p/8244724.html

    http://www.cnblogs.com/linxiyue/p/8244724.html

  6. php 中date显示时间不对与Linux文件乱码问题

    php 中date显示时间不对解决办法如下1.修改/etc/php.ini文件 在里头中找到data.timezone =去掉它前面的分号';' 然后设置data.timezone = “Asia/S ...

  7. django源码笔记-【1】(转)

    add by zhj:第二段代码有修改 原文:http://www.cnblogs.com/gaott/archive/2012/02/28/2371181.html 前言 Django是一个开放源代 ...

  8. Unity-反编译由IL生成的DLL文件

        本文由博主SunboyL原创,转载请注明出处:http://www.cnblogs.com/xsln/p/DLL_DeCompilation.html     在Unity实际开发过程中,我们 ...

  9. ansible 批量在远程主机上执行命令

    ansible 和 saltstack 都是为了同时在多台主机上执行相同的命令, 但是 salt配置麻烦,ansible基本不用配置, ansible 通过ssh来连接并控制被控节点 1. 安装 第一 ...

  10. sass和css的calc运算

    1.sass不识别不同单位之间的计算,而calc则没问题. width: #{1rem - 2px}; /*出错*/ width: calc(1rem - 2px); 通常情况定制css样式,我不需要 ...