如何使用SQLDiag工具来追踪死锁错误

开发者在线 Builder.com.cn 更新时间:2006-09-23作者:Builder 来源:

为了制造死锁,您需要首先运行连接A中的代码,紧接着运行连接B中的代码,正如连接A中WAITFOR DELAY语句所示的那样,您大约有3秒钟的时间来切换连接并执行连接B中的代码。如果您正确执行了以上步骤,那将会在一个查询窗口中收到和下面这条信息非常相似的出错信息:

Server: Msg 1205, Level 13, State 50, Line 1

Transaction (Process ID 53) was deadlocked on

 resources with another process

 and has been chosen as the deadlock victim. Rerun the transaction.

发生死锁是因为两个连接之间发生了资源争夺,连接A锁定了DeadlockTable2并试图更新DeadlockTable1,而这是无法实现的,因为与此同时,连接B锁定了DeadlockTable1,而且需要在DeadlockTable2上运行更新语句,这个场景是一个非常经典的例子,这也是为什么在设计事务的时候,您要尽可能按照相同的使用顺序来更新表格,这一点非常重要。

如果您按照这种方式来设计事务,那么出现这种令人头疼的情况的可能性就会降低很多。SQL Server数据库引擎有专门的算法来通知您有这种情况出现,它还会系统性地关闭一个进程并允许另外一个顺利完成。

现在我们已经体验了死锁,我们可以使用SQLDiag工具将错误信息输出到一个文本文件了。您可能会感到奇怪,既然在出现死锁错误的情况下可以从屏幕上看到错误信息,为什么还要将这些信息输出到文本文件中呢?开启追踪标记可以捕获在您的系统上发生的所有死锁,这对于有大量数据更新的系统来说,这些信息是非常有价值的。在文本文件中查找并观察何时发生错误、哪些对象牵连在错误中,可以节省您大量的研究时间。

为了执行SQLDiag工具,打开一个命令提示符窗口并浏览到SQL Server安装目录中的Binn文件夹。一个可能出现该工具的文件夹是C:Program FilesMicrosoft SQL ServerMSSQLBinn。

在使用这个工具的时候,您可能会用到一些参数,我会用到-E和-O开关,-E的含义是在执行是使用集成的安全属性;而-O开关可以指定您要输出的文件路径,以下是使用该工具参数的一个例子:

C:Program FilesMicrosoft SQL ServerMSSQLBinn

SQLDiag –E –O C:SQLDiagOutput.txt

图1是一个SQLDiag.txt文件的例子,这个屏幕截图展示了上述死锁的细节,这个输出文件说明了死锁是由两个SQL语句造成的,您还可以看到发布命令的连接ID(SPID),这些信息对于识别流程和流程再造都是非常有价值的,它们可以帮助减少此类错误的发生频率。

图1

Conclusion

死锁,尤其在2005版之前的SQL Server中,常常是数据库管理员的致命伤,如果没有好的方法来捕获并重现死锁事件,数据库管理员和开发者不得不依赖SQL Profiler和其它的工具来捕获死锁,并用于进一步的研究工作。SQLDiag是一个非常有效的追踪工具,不仅可以用来对付这些令人尴尬的死锁错误,还可以用来捕获SQL Server环境中很多其它的诊断信息。我建议您要花些时间来研究这个强大的工具,而不仅仅是尝试本文中的例子,因为SQLDiag可以作为预防性的工具来避免未来可能出现的令人头痛的问题。

责任编辑:张琎

查看本文国际来源

用户评论

  • 用户名
  • 评论内容