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

建测试数据

CREATE DATABASE testdb;

GO

USE testdb;

CREATE TABLE table1
(
id INT IDENTITY PRIMARY KEY,
student_name NVARCHAR(50) ) INSERT INTO table1 values ('James')
INSERT INTO table1 values ('Andy')
INSERT INTO table1 values ('Sal')
INSERT INTO table1 values ('Helen')
INSERT INTO table1 values ('Jo')
INSERT INTO table1 values ('Wik') CREATE TABLE table2
(
id INT IDENTITY PRIMARY KEY,
student_name NVARCHAR(50) ) INSERT INTO table2 values ('Alan')
INSERT INTO table2 values ('Rik')
INSERT INTO table2 values ('Jack')
INSERT INTO table2 values ('Mark')
INSERT INTO table2 values ('Josh')
INSERT INTO table2 values ('Fred')

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

USE testdb;

-- Transaction1
BEGIN TRAN UPDATE table1
SET student_name = student_name + 'Transaction1'
WHERE id IN (1,2,3,4,5) UPDATE table2
SET student_name = student_name + 'Transaction1'
WHERE id = 1 COMMIT TRANSACTION

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

USE testdb;

-- Transaction2
BEGIN TRAN UPDATE table2
SET student_name = student_name + 'Transaction2'
WHERE id = 1 UPDATE table1
SET student_name = student_name + 'Transaction2'
WHERE id IN (1,2,3,4,5) COMMIT TRANSACTION

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

说下跟踪死锁的方法:

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

DBCC TRACEON (1204, -1)
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'

最新文章

  1. python 学习笔记5(深浅拷贝与集合)
  2. openSSL漏洞原理及安全加固
  3. iOS:Autolayout自动布局实例
  4. Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程
  5. 《Python 学习手册4th》 第十五章 文档
  6. jenkin系列_调度jmeter实现分布式测试
  7. 微信公共服务平台开发(.Net 的实现)2-------获得ACCESSTOKEN
  8. android音乐播放器开发 SweetMusicPlayer 实现思路
  9. More is better--hdu1856(并查集)
  10. 滚轮事件的防冒泡、阻止默认行为的代码(效果是:只让当前div滚动,连当前文档都不滚动的效果)
  11. spring整合mybatis错误:class path resource [config/spring/springmvc.xml] cannot be opened because it does not exist
  12. WIKI 部署后记录
  13. ASUS RT-AC68U 刷梅林固件及安装***插件记录(详细)
  14. 微信支付现金红包接口应用实例代码说明和DEMO详解,适合用来做微信红包营销活动、吸粉利器
  15. shell脚本实现svn目录同步和提交
  16. 201771010134杨其菊《面向对象程序设计(java)》第十五周学习
  17. Linux进程调度策略的发展和演变--Linux进程的管理与调度(十六)
  18. xpath教程 3 - xpath的小结
  19. P3877 [TJOI2010]打扫房间
  20. linux下自己安装软件做成命令

热门文章

  1. C++和Java中的静态Static用法
  2. postgresql----网络地址类型和函数
  3. Css 中的 block,inline和inline-block概念和区别
  4. POJ-1887 Testing the CATCHER(dp,最长下降子序列)
  5. vs中如何添加库目录、包含目录以及依赖-----转
  6. Java编程思想第四版随书源码官方下载方法
  7. hue安装及基本测试-笔记
  8. 通过 Kubernetes 和容器实现 DevOps
  9. vueawesomeswiper自定义 导航点
  10. IO流(5)判断功能