As we already saw, the reasons why we have blocking issues and deadlocks in the system are pretty much the same. They occur because of non-optimized queries. So, not surprisingly, troubleshooting techniques are very similar. Let’s have a quick look. We’ll use the same scriptsI used last time.

我们现在已经知道,造成系统阻塞以及死锁的原因往往非常相似,基本都是因为使用了未经过优化的查询造成的。所以排解这些问题的技术非常相似就不那么意外了。让我们仔细来看一看实例,还是用我们以前采用过的脚本。

The simplest approach is to use SQL Profiler. There is “Deadlock graph” event in the “Locks” event group you can use. Click on the picture to open it in the different window.

最简单的方法就是采用SQL自带的性能监控工具,这里我们可以使用跟踪属性下面的事件选择项卡,展开锁节点,下面的有一个死锁图可供我们选择,它能帮忙我们分析死锁原因。

Let’s start the trace and trigger deadlock.

现在我们开始跟踪以及触发死锁

As you can see, it shows you very nice picture. There are 2 sessions (ovals) involved. Those sessions compete for the page locks (squares). You can see what locks each session held and you can even track it down to the resources (but that rarely needed). You can even see the statements when you move the mouse over the session oval and wait for the tool tip.

上面是呈现的是一个非常友好的图,图中包含两个会话(图中椭圆显示)。这两个会话都会竞争数据页(图中方块显示)上的锁。你可以看到每个会话已经获得的锁而且你还可以向下一直跟踪到它们各自所引用的资源(这是非常必要的),甚至你能跟踪到具体的SQL语句块当你将鼠标放在会话的上方时系统会给出相应的提示。

In context menu for “deadlock graph” line in the grid above, you have “Extract event data” menu command that can save this information as the file.

在监视窗口中有一个死锁图的字样,你可以点击右键,此时会弹出属性菜单,你可以将这些死锁相关的信息保存到文件中。

You can open it as the graph in management studio or, technically, simply look at XML which is extremely familiar:

你可以在SQL管理器中打开它,或者直接以XML形式查看也非常眼熟。

As you can see it’s way more detailed in compare with graphical representation. It’s also extremely familiar with blocking process report – and you can use same technique and query sys.dm_exec_sql_text if you need to obtain sql text from handle. I demonstrated how to do that in post related with blocking troubleshooting.

这是和图形方式非常详细的一个比较说明,它和blocking process report非常相似。你可以同样通过查询sys.dm_exec_sql_text 来显示你需要知道的SQL语句。我之前已经做了一个演示的实例。[翻译]:SQL死锁-阻塞探测

In case, if you don’t want to use SQL Profiler, there are 2 options you can use. The first one is enabling trace flag 1222 with DBCC TRACEON(1222,-1) command. When you have it enabled, SQL Server put deadlock graph XML to SQL Server log.

如果你不想使用SQL自带的性能监测工具,这里还有两种办法。第一就是运行DBCC TRACEON(1222,-1)命令,它将会把死锁相关的信息存储为SQL日志。

Another option is using extended events (SQL Server 2008/2008R2). Again, it’s very powerful method although requires some initial work to set it up. As with the blocking, I’m leaving it out of scope for now.

另外一个方法就是使用在SQL SERVER 2008/2008R2中的扩展事件。它是一个非常强的工具,但需要一些初始化的工作。

How to deal with deadlocks? Of course, the best thing is not to have deadlocks at the first place. Again, golden rule is to optimize the queries. Meanwhile, if you need to control (up to degree) what session will be terminated, you can use SET DEADLOCK PRIORITY option. There are 21 priority levels available. When 2 sessions deadlocked, the session with the lower deadlock priority level would be chosen as the victim. In case of the same priority level (default case), SQL Server chooses the session that is less expensive to rollback.

如何解决死锁?当然,最好的办法就是避免出现死锁,解决死锁的黄金准则就是优化查询。同时,如果你想监控哪一个会话可能会被终止,你可以使用 SET DEADLOCK PRIORITY 这个选项。这里有21种有效的优先级别。当有两个会话出现死锁后,级别低的会话将会成为竞争中的牺牲品。如果两个会话拥有相同的级别,那么SQL会选择一个回滚付出代价比较小的一个做为牺牲品。

If session is chosen as the victim, it would be aborted with error code 1205. In such case client (or T-SQL code) can catch the exception and re-run the query. But again, the best way is avoiding deadlocks at the first place.

如果一个会话被选中为牺牲品,那么它会被取消同时抛出的错误代码为1205。系统客户端可以捕获到这个错误然后重新尝试执行查询。但是最好的方法就是想办法避免出现死锁。

[翻译]:SQL死锁-死锁排除的更多相关文章

  1. SQL Server死锁

    SQL Server死锁 多个事务之间互相等待对方的资源,导致这些事务永久等待 注意是永久等待,而非长事务 死锁的4个条件 互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程 ...

  2. SQL Server死锁中的会话隔离级别为序列化(Serializable)实验测试

    最近在分析SQL Server的死锁时,发现一个比较有意思的现象,发现死锁当中一个会话的隔离级别为序列化(Serializable),这个是让人比较奇怪的地方,我们知道SQL Server数据库的默认 ...

  3. SQL Server死锁产生原因及解决办法 .

    其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B,另一个用户B 访问表B(锁住了表B),然后企图访问表A,这时用户A由于用户B已经锁住表B,它 ...

  4. SQL Server死锁的解除方法

    如果想要查出SQL Server死锁的原因,下面就教您SQL Server死锁监控的语句写法,如果您对此方面感兴趣的话,不妨一看. 下面的SQL语句运行之后,便可以查找出SQLServer死锁和阻塞的 ...

  5. SQL Server死锁总结

    1. 死锁原理 根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 死锁的四个必要条件:互斥条件(Mutua ...

  6. SQL Server死锁总结 [转]

    1. 死锁原理 根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 死锁的四个必要条件:互斥条件(Mutua ...

  7. SQL SEVER 死锁// 解除死锁

    SQL SEVER 死锁 USE mastergo CREATE PROC killspid (@dbname VARCHAR (20))AS   BEGIN      DECLARE @sql NV ...

  8. SQL Server死锁排查

    1. 死锁原理 根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 死锁的四个必要条件:互斥条件(Mutua ...

  9. Update导致SQL Server死锁的典型方法(转载)

    此文为转载文章,描述的很好,没有验证过. 最近遇到了一个看上去很奇怪,分析起来很有意思的死锁问题.这个死锁看上去难以理解.而分析过程中,又使用了很多分析SQL Server死锁的典型方法.记录下来整个 ...

随机推荐

  1. [WPF]有滑动效果的进度条

    先给各位看看效果,可能不太完美,不过效果还是可行的. 我觉得,可能直接放个GIF图片上去会更好. 我这个不是用图片,而是用DrawingBrush画出来的.接着重做ProgressBar控件的模板,把 ...

  2. AngularJs bower install 卡主不动解决办法

    ,在开发过程中,前端的依赖包都是使用bower来进行安装的,但是经常就是下载不了package特别的苦恼,这里顺便要抱怨一下github,不是一般的慢!! 后来在stackoverflow找到一个方法 ...

  3. java简单词法分析器(源码下载)

    java简单词法分析器 : http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%8D%E6%B3%95%E5%88%8 ...

  4. 自制jQuery标签插件

    在项目中需要一个添加标签的小插件,查看了一些已有插件后,发现很现成的高级插件,也有比较简单的插件.最后还是决定自己来写,这样能控制代码,以后与其他插件结合使用的时候能更好的把控.初步在IE6 7 8, ...

  5. HTML5移动Web开发(一)——HTML5和移动网站基本概念以及一些模拟器

    当前,手机设备发展迅猛.屏幕尺寸各不相同.存储和性能仍有局限性,如何结合HTML5的功能,在多平台上创建高性能.响应式的移动网站,是Web开发者所要面对的首要挑战.HTML5以及移动网站都是很有前景的 ...

  6. Android安装BusyBox(三星N7108)

    近期公司安卓app测试,分配任务为监控APP内存.CPU占用率.因安卓是基于linux开发,故很容易就联想使用Linux监控相关的命令.想法总是美好的,现实总是残酷的,使用三星 Galaxy Note ...

  7. Android之自定义ListView(一)

    PS:自定义View是Android中高手进阶的路线.因此我也打算一步一步的学习.看了鸿洋和郭霖这两位大牛的博客,决定一步一步的学习,循序渐进. 学习内容: 1.自定义View实现ListView的I ...

  8. 20 个高质量响应式的 HTML/CSS 网站模板

    BisLite: Free HTML Website Templates Professional Responsive HTML5/CSS3 template Respond Wood workin ...

  9. 大话PHP缓存头

    304的请求机制和200有什么不一样呢?在fiddler中查看304请求的时候突然想到这个问题,就想到研究下这个304请求机制了. 我们自己在nginx上放一个文件,test.png.可以使用下面的地 ...

  10. position属性absolute与relative 详解

    最近一直在研究javascript脚本,熟悉DOM中CSS样式的各种定位属性,以前对这个属性不太了解,从网上找到两篇文章感觉讲得很透彻,收藏下来,唯恐忘记.一.解读absolute与relative ...