设为首页 收藏本站
查看: 907|回复: 0

[经验分享] SQL Server里如何处理死锁

[复制链接]

尚未签到

发表于 2017-7-12 19:50:21 | 显示全部楼层 |阅读模式
  在今天的文章里,我想谈下SQL Server里如何处理死锁。当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作。首先我想给你大致讲下SQL Server如何处理死锁。最后我会展示下SQL Sever里特定的死锁类型,还有你如何避免和解决它们。
死锁处理
  死锁的好处是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或更高,你可以使用故障排除来故障排除死锁场景。扩展事件提供你system_health事件会话,它跟踪自SQL Server上次重启后发生过的死锁。还有启用1222跟踪标记,SQL Server会把死锁信息写入错误日志。
死锁类型
  在SQL Server里会发生各种类型的死锁。在这一部分我想进一步谈下最常见的几个。
  几乎每个SQL Server我看到最典型的的死锁是著名的书签查找死锁,当你有同时对聚集和非聚集索引读写活动时发生。它基本上是因为不好的索引设计造成的。在我作日常SQL Server的故障排除重,我可以说所有的死锁,至少有90%可以通过更好的索引设计来解决。书签查找死锁可以通过提供覆盖非聚集索引轻松解决。
  另一个常见的死锁是所谓的循环死锁(Cycle Deadlock),这里你的每个查询用不同的顺序访问表。为了避免这个特定的死锁,你要确保每个查询用同样的顺序访问表。在SQL Server里会发生的最有意思的死锁是所谓的内部并行死锁(Intra-Parallelism Deadlock),这里平行的运算符在各自的线程内部死锁。下图展示了一个典型死锁图。
   DSC0000.png
  图片本身就是一个艺术品,它因触发SQL Server里的BUG而发生。遗憾的是,这个BUG不会被微软修正,因为它引入回归的可能性。因此你要确保引起这个死锁的查询,要在SQL Server里单线程运行。你可以通过多个选项来实现单线程执行:

  • 在你的索引策略上下功夫,这样的话查询的花费会在当前并行阈值下(默认为5)
  • 使用MAXDOP 1查询提示,来提示SQL Server以单线程运行你的问题查询
  另一个死锁的特效疗法是启用乐观并发,尤其是提交读快照隔离(Read Committed Snapshot Isolation (RCSI)),他对你的程序是完全透明的。使用乐观并发,共享锁消失,这意味着在SQL Server里你可以避免大量的典型锁。
小结
  死锁是SQL Server通过回滚最便宜的事务自动处理。然而你要尽可能小的确保死锁,因为每个回滚的死锁都会给你的终端用户带来不好的影响。死锁可以通过好的索引策略来避免,另外使用乐观并发也是应付它们的特效药。
  感谢关注!
原文链接
  https://www.sqlpassion.at/archive/2017/02/20/how-to-handle-deadlocks-in-sql-server

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393280-1-1.html 上篇帖子: Performance Monitor4:监控SQL Server的IO性能 下篇帖子: SQL Server 2016 SP1 标准版等同企业版?!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表