SQLSERVER数据库快速查找死锁图信息

来源:互联网 发布:矩阵的迹怎么求 编辑:程序博客网 时间:2024/05/21 19:33

题外话:之所以写这个博客,是应了群里大家的要求,从来没有写过,写的不好多担待。
引言:不要以为看到引言就觉得像是写书,其实我是想在这里说下我寻找死锁的旅程。我们公司做的是web项目,大概一年前开始接手目前负责的部分就断断续续的出现死锁,出现的几率不多,就像大姨妈,基本每个月都会来一次,偶尔还会两次。开始时,只是知道程序报死锁错误,但是根本无从下手,以前没有接触过死锁啊,完全蒙圈啊。所以就把问题归结为“高并发”引起的,属于偶发问题,忽略吧!就这样忽悠了一段时间。可以后来还是会持续的出现死锁问题,这可怎么办啊。不能不管了,第一时间想到的就是百度。关于死锁问题的帖子案例什么的几乎看了个遍,明白了死锁的产生机制:资源竞争。这词说的很到位啊,就是互相抢啊,互相伤害,就死了。开始以为是SQL语句写的有问题,但是研究来研究去,最后确定SQL没有问题啊。程序中的select的部分都已经加了with(nolock)了,update怎么会死锁呢?还给我牺牲掉了。又成了无头命案了。有半年时间了,开始怀疑是触发器有问题,然后各种优化表中的触发器,然后对大家说,这回肯定好了,不会有问题了。可是没多久,死锁还是不约而至的出现了。好吧,我认了,为了让程序出现死锁后,仍然可以正常运行,加了回滚机制,就是在update时,try一下,如果执行update报错,那么我就把之前执行的update数据全部再修改回原来的(业务需求,特殊原因这样写的),就这样,坚持了半年吧。可是没有解决死锁的问题,死锁还是会时不时的出来,苍天啊,谁来拯救我啊。期间我像各界朋友,群里的朋友请教,都没有得到解决。忽然有一天,无意中发现了sqlserver一项特殊的功能。加日志标记,加跟踪。本地测试很有效果啊,可以查到死锁信息,可是BOSS不让用啊。说是影响性能。好吧,我无言以对。再后来,就这样一直带带拉拉的研究死锁,无意中又发现新的功能,可以获取死锁信息,很快捷,不需要什么特殊设置,不影响性能。堪称是完美的查询死锁信息的途径。

说了这么多废话,接下来进入正题,内容并不多。查询死锁信息的方式有很多,不限于此。

注意:在出现死锁牺牲品时,可以用此方法查询死锁信息,死锁信息写入偶尔会略有延迟,大概1分钟左右(没弄清楚,不影响使用,所以刚出现死锁,马上查可能查不到死锁信息,等一会再查就有了),因为事件记录得信息文件大小默认为5M,所以该方法仅适合在出现死锁一定时间内才能查询到(时间大概为1天左右,视数据库使用情况而定),也可以查询到除死锁以为得其他信息,待挖掘。

1.打开 管理 > 扩展事件 > 会话 > system_health > package0.event_file 双击打开。
这里写图片描述

2.鼠标右键点击name列,选择 在此列中查找。
这里写图片描述

3.输入deadlock 按回车键搜索
这里写图片描述

4.检索到死锁信息,鼠标双击详细信息里得行内容。
这里写图片描述

5.将死锁信息文本保存为后缀是.xdl的文件。
这里写图片描述

6.双击保存得文件或用sqlserver 管理器打开,即可查看死锁图形。
这里写图片描述
这里写图片描述

以上就是查找死锁信息的方法,可以设置筛选,会更方便定位查找,我觉得这个方法很便捷,大家觉得有帮助给个赞吧,欠缺的话多提意见,这样我也有动力写好死锁分析文档,更新待续!

PS:在群里有的想法不统一,思路上有分歧,可能我现在站的层面还没达到你们那么高,我只是一个小白,路途还很远,还有很多要学,我只是站在小白的角度说下问题,也许错了,在以后学习的过程中我会慢慢改正。我只是想分享下自己找问题的经验。为以后走我这条路的人开辟条捷径。

2 0
原创粉丝点击