学习如何避免SQL Server数据库死锁的第一步是做好准备工作。根据SQL Server专家的说法,了解死锁(特别是导致死锁的原因)是预防并解决死锁的关键。
死锁与阻塞不是一回事。后者通常发生在数据库操作期间,当一个事务尝试访问已被另一个事务锁定的系统资源时。SQL Server系统会阻止第二个事务,直到第一个事务完成其进程并取消锁定,这种情况可由SQL Server自身解决而无需任何手动干预。
另一方面,SQL Server死锁则发生在两个事务互相阻止访问它们需要使用的资源,导致所谓的死锁阻止两个事务继续进行。SQL Server可以自动清除死锁,但采取的方法是终止其中一个事务线程,并且,对于数据库管理员(DBA)来说,很难通过干预确保死锁不再发生。
什么导致数据库死锁?
管理工具供应商SolarWinds的“头号极客” Thomas LaRock在2016年6月的博客文章中写道,SQL Server中存在4个主要且相互关联的死锁原因:应用程序代码、数据库架构设计、所声称的访问模式和数据库中的事务隔离级别设置。
LaRock补充说,死锁不仅发生在包含大型表格(带索引)的数据库中,也可能发生在小表格中。他说,当数据库出现死锁,最终用户会将其视为性能瓶颈,这给SQL Server DBA和应用程序开发人员带来压力,他们必须“共同努力追查根本原因并解决问题”。
微软有关如何避免SQL Server死锁的技巧。
避免SQL服务器死锁的方法
对于避免SQL Server中的死锁,说起来容易做起来难,但这也不是不可能完成的任务。
在2017年12月的一篇博文中,香港DataNumen公司的数据恢复专家Victor Simon指出,糟糕的数据库设计是导致死锁的常见原因。为了帮助最大限度降低死锁风险,他表示,SQL Server数据库管理员应该为并发事务访问数据库对象创建明确的顺序,并制定以明确的规则来管理进程。
Simon说,数据库管理员还应该限制用户在处理事务时输入数据。此外,这种情况也会出现死锁:数据库配置为READ COMMITTED事务隔离级别(SQL Server的默认设置),用户对已锁定的表格运行查询时。其他查询必须等待锁定释放,但Simon说在T-SQL语句中使用NOLOCK表提示允许数据库管理员覆盖表锁定。
Simon写道,避免SQL Server死锁的另一种方法是使用绑定连接。这使得应用程序可以打开与数据库的多个协作连接,这些连接可以在锁定时相互协作,因此它们不会相互阻塞,从而降低了死锁和数据库损坏等问题的可能性。
通过SQL Server的锁定监视器解决死锁
SQL Server附带锁定监视器功能,可以检测和终止死锁。它会定期在数据库实例中搜索死锁情况。默认搜索间隔是每五秒钟,但微软表示,如果发现任何死锁,则会减少到100毫秒,新的间隔会根据死锁的频率而变化。
当锁定监视器检测到多个应用程序线程陷入死锁时,它会选择其中一个作为死锁牺牲品。该线程的处理作业会终止,并且,正在进行的事务在数据库中回滚。这样做会释放死锁受害者持有的锁,这允许其他被阻止的会话继续处理。
在默认情况下,锁定监视器根据回滚成本确定死锁牺牲品,选择从处理角度回滚最便宜的线程。数据库管理员还可以使用SET DEADLOCK_PRIORITY语句在发生死锁时为线程分配优先级。
然后将选择具有最低优先级的会话作为死锁受害者。如果多个会话具有相同的死锁优先级,则锁定监视器将恢复为选择具有最低回滚成本的会话。
获取有关死锁的信息可帮助避免死锁
尽管依靠锁定监视器来完成这项工作似乎更方便,但数据库管理员仍必须调查死锁以确定其原因,以便可采取措施在将来避免它们。主要有三种方法来获取有关SQL Server死锁的信息—通常被称为死锁图。
在T-SQL中使用跟踪标志1222会在发生死锁后返回在SQL Server的错误日志中捕获的信息;也可以使用跟踪标志1204,但是1222提供了更多细节。根据SQL Server工具供应商Redgate公司产品推广者Grant Fritchey的说法,跟踪标志曾经是访问死锁图信息的唯一真正方法。
然而,Fritchey在Redgate网站的文章中写道,为了捕获有关死锁的信息,必须永久启用跟踪标志1222。随着更新更有效方法的出现,他建议仅使用跟踪标志作为帮助防止死锁的最后手段。
其他方法包括在SQL Server的内置扩展Extended Events监视工具中使用system_health会话来查看死锁信息。Extended Events在SQL Server 2008中引入,并且,微软将死锁图添加到SQL Server 2012中的system_health会话。根据微软的使用文档显示,该会话默认启用,并会自动捕获有关死锁所涉及进程和系统资源的信息,以及死锁受害者名单。
数据库管理员还可以使用微软的SQL Server Profiler工具来保存死锁图,以便在SQL Server Management Studio中查看和分析,尽管这个工具现在处于维护模式,不建议用于新应用程序。作为替代方案,用户可以转向第三方性能监视工具,以帮助他们解决和避免SQL Server中的死锁。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
翻译
相关推荐
-
如何使用SQL Server数据库脚本创建数据库?
你可以手工创建SQL Server数据库,但懂得如何设置数据库脚本是十分必要的。本文是执行数据库创建脚本所涉及的步骤。
-
如何为你的数据库事务日志减肥?
在大多数SQL Server的工作环境中,尤其是在OLTP环境中,数据库的事务日志性能出现瓶颈时往往会导致事务完成需要更多的时间。
-
SQL Server版本指南之免费版数据库
本系列文章共分为三个部分,分别讨论SQL Server企业版、免费版和标准版三个版本的数据库平台,本文主要介绍SQL Server免费版数据库。
-
五个实用的SQL Server PowerShell脚本
Windows PowerShell为SQL Server数据库自动化任务、收集信息以及部署对象都操作提供了一个非常简单直接的方式。