如何解决和避免SQL Server数据库死锁

日期: 2019-04-09 作者:Lindsay Moore翻译:邹铮 来源:TechTarget中国 英文

学习如何避免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

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

翻译

邹铮
邹铮

相关推荐