第20/24周 死锁(Deadlocking)
大家好,欢迎回到性能调优培训。今天讨论SQL Server里的死锁(Deadlocking),第5个月的培训就结束了。当2个查询彼此等待,没有查询可以继续它的工作就会发生死锁。第一步我会概括介绍下SQL Server如何处理死锁。最后我会向你展示下SQL Server里一些特定死锁,还有你如何避免并解决它们。
死锁处理(Deadlock Hanging)
死锁的好处是SQL Server会自动检测并解决它们。为了解决死锁,SQL Server需要回滚最便宜的2个事务。在SQL Server上下文里,最便宜的事务是写入事务日志,字节数更少的事务。
SQL Server在后台进程里使用所谓的Deadlock Monitor来实现死锁检测。这个后台进程每5秒钟运行一次,为死锁检查当前的死锁情况。最坏的情况,因此死锁应该不会超过5秒钟。回滚的查询收到1205号错误。死锁的"好处"是你可以从那个错误情形里完全还原,而不需要用户互动。一个聪明的开发人员必须做下列事情来从死锁中恢复:
- 当异常抛出时,检查下1205错误号
- 暂停应用程序给其他查询一些时间来完成它的事务并释放它已获得的锁
- 重新提交被SQL Server回滚的查询
查询重新提交后,查询应该继续没有问题,因为其它阻塞的查询已经完成它的事务。当然,你应该保持再次死锁的跟踪,这样的话,你就不用反复重试你的事务。
你可以在不同方式里故障排除死锁。SQL Server Profiler提供你Deadlock Graph事件,死锁一旦发生就会检测到。如果你在SQL Server 2008及更高的版本,你也可以用扩展事件(Extended Events)来故障排除死锁情形。扩展时间提供你system_health事件会话,它更总自上次SQL Server重启后发生过的死锁。使用启用1222跟踪标志(trace flag),SQL Server会把死锁信息写入错误日志。
死锁类型
在SQL Server里可以发生多个类型的死锁。在这个部分我想详细谈下最常见的几个。
几乎在每个SQL Server里都会看到的一个经典死锁是著名的书签查找死锁(Bookmark Lookup Deadlock),当你同时对聚集和非聚集索引进行读写是会发生。这个是主要是因为不好的索引设计的死锁。在我的日常生活里,作为SQL Server的故障排除者,我可以说至少所有死锁的90%可以通过应用更好的索引设计到你工作中来避免。书签查找死锁可以通过第8周性能调优培训里介绍的提供覆盖非聚集索引来轻松剔除。

另一个常见的死锁是所谓的循环死锁(Cycle Deadlock),在你的各个查询以不同的顺序访问表里发生。为了避免那个特定死锁,你总要确保查询在同样的顺序访问表。另外在SQL Server里可以发生的“最好”死锁是所谓的内部并行死锁(Intra-Parallelism Deadlock),在并行运算符(Distribute Streams, Gather Streams, Repartition Streams)已经在各自线程间内部死锁。下图显示了一个典型的死锁图。

图片本身就是个很高雅的艺术品(pure art),因为你命中SQL Server里的1个BUG才发生。遗憾的是这样的BUG微软不会去修正,因为会引入回归(regressions)的可能。因此你要确保引起这个死锁的查询,在SQL Server里都是单线程运行的。你可以通过多个选项来获得执行计划的单线程执行:
- 在索引设计上做工作,这样的查询成本低于当前的并行开销阈值(默认5)
- 使用查询提示MAXDOP 1让SQL Server以单线程运行你有问题的查询
另一个死锁的特效疗法(miracle cure)是启用乐观并发控制(optimistic concurrency),尤其是读提交快照隔离(Read Committed Snapshot Isolation (RCSI)),这个2个星期前就已经讨论过,它对你的程序是完全透明的(completely transparent)。使用乐观并发控制,共享锁(S)就消失了,这意味这你可以剔除SQL Server里大量的典型死锁。
小结
死锁通过SQL Server回滚最便宜的事务来自动处理。但是你必须确保死锁尽可能小,因为每个回滚的事务都会负面影响你的终端用户。 死锁可以通过好的索引设计来避免,使用乐观并发控制对它们也可以是特效疗法。
下个星期,我们会开始性能调优培训的最后一个月,我们会讨论SQL Server里性能调优和故障排除的一切。请和我一起期待火力全开的最后一个月!
围观PPT:
第20/24周 死锁(Deadlocking)的更多相关文章
- 第0/24周 SQL Server 性能调优培训引言
大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于 ...
- 2016年12月3日 星期六 --出埃及记 Exodus 20:24
2016年12月3日 星期六 --出埃及记 Exodus 20:24 "`Make an altar of earth for me and sacrifice on it your bur ...
- 分享Kali Linux 2017年第24周镜像文件
分享Kali Linux 2017年第24周镜像文件 Kali Linux官方于6月11日发布2017年的第24周镜像.这次维持了11个镜像文件的规模.默认的Gnome桌面的4个镜像,E17.KD ...
- 第4/24周 页面限制8060 bytes
恭喜您!在你面前就只剩下几页了,然后你就可以完成第1个月的SQL Server性能调优培训了.今天我将讲下页的一些限制,还有为什么你会喜欢这些限制,同时也会讨厌这些限制. 正如你在第2周学到的,数据页 ...
- 第16/24周 SQL Server 2014中的基数计算
大家好,欢迎回到性能调优培训.上个星期我们讨论在SQL Server里基数计算过程里的一些问题.今天我们继续详细谈下,SQL Server 2014里引入的新基数计算. 新基数计算 SQL Serve ...
- 第17/24周 悲观并发控制(Pessimistic Concurrency)
大家好,欢迎回到性能调优培训.今天标志着第5个月培训的开始,这个月我们会谈论SQL Server里的锁.阻塞和死锁(Locking, Blocking, and Deadlocking). SQL S ...
- 第19/24周 锁升级(Lock Escalations)
大家好,欢迎回到性能调优培训.上2个星期我们已经讨论了SQLServer里的悲观和乐观锁.今天我想谈下SQL Server里对于锁的一个特殊现象:所谓的锁升级(Lock Escalations).在我 ...
- Java(20~24)
1.Collection中的集合称为单列集合,Map中的集合称为双列集合(键值对集合). 2.Map常用方法:map.put() map.get() map.remove() map.ke ...
- 第3/24周 区_SQL Server中管理空间的基本单位
哇哦,SQL Server性能调优培训已经进入第3周了!同时你已经对SQL Server内核运行机制有了很好的认识.今天我会讲下SQL Server中的区管理,因为这是个很重要的话题,我们会在第23周 ...
随机推荐
- MongoDB与内存
来自 http://www.ttlsa.com/mongodb/mongodb-and-memory/# 但凡初次接触MongoDB的人,无不惊讶于它对内存的贪得无厌,至于个中缘由,我先讲讲Linu ...
- 微软再次要求Google审查官方链接 称将进行调查
之前代表微软向Google发出DMCA删除通知的反盗版公司再次要求Google审查Microsoft.com官网链接.微软对此表示将进行调查,已经要求反盗版公司停止以微软的名义发出DMCA通知. 仅仅 ...
- MQTT和WebSocket
严格来说,MQTT跟WebSocket关系不大.他们不是在一个层级的. MQTT和TCP.WebSocket的关系可以用下图一目了然: 参考资料: http://www.zhihu.com/q ...
- [WPF实用技巧]如何使WPF的TreeView节点之间有连线
示例代码:TreeViewEx.zip 原文地址:http://www.codeproject.com/Tips/673071/WPF-TreeView-with-WinForms-Style-Fom ...
- Windows 下使用git 将代码托管到开源中国-(http://git.oschina.net/)
一.准备工作 当然是准备在windows 下使用需要的环境,和工具. msysgit 下载地址:http://msysgit.github.io/ TortoiseGit 下载地址:https:// ...
- 基于uploadify.js实现多文件上传和上传进度条的显示
uploadify是JQuery的一个插件,主要实现文件的异步上传功能,可以自定义文件大小限制.文件类型.是否自动上传等属性,可以显示上传的进度条.官网地址是http://www.uploadify. ...
- Linux uniq命令
200 ? "200px" : this.width)!important;} --> 介绍 uniq命令是一个文本去重命令,它能对标准输入和文本文件进行去重操作,并且能将结 ...
- [翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (一)
在前两章 ( 一 , 二 ) ,我们大致讲了Actor和message是怎么工作的,让我们看一下日志和测试我们的 TeacherActor . RECAP 这是上一节我们的Actor代码: class ...
- Centos Another app is currently holding the yum lock
yum命令用ctrl+z命令中断后,再运行yum时,出现: Existing lock /var/run/. Another app is currently holding the yum lock ...
- Netty学习四:Channel
1. Channel Channel是Netty的核心概念之一,它是Netty网络通信的主体,由它负责同对端进行网络通信.注册和数据操作等功能. 1.1 工作原理 如上图所示: 一旦用户端连接成功,将 ...