死锁错误未返回死锁SQL


13

Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

当我的一个网站繁忙时,我会随机收到此错误。我大致知道它在哪组表上发生,但是根据我在其他程序中的经验,我通常会在发生死锁的地方返回SQL。我应该打开一个标志来允许这种情况发生吗?

我将尝试将死锁本身作为一个单独的问题进行调试,因为这是我目前的主要问题。

我正在使用SQL Server 2008标准版。


您可以重新启动服务吗?如果能够退回该服务,则可以在启动参数中添加添加跟踪标志1204,以将死锁的详细信息记录到SQL Server日志中。> 1204:返回参与死锁的资源和锁类型,以及受影响的当前命令。>>适用范围:全球唯一的
Tevo d

1
使用配置管理器。在“ SQL Server服务”下,右键单击并打开属性。转到高级选项卡,启动参数。您将具有用于主数据库文件等位置的条目。添加;-T1204跟踪标志以结束并重新启动服务。
Tevo D 2012年

4
为什么要重启服务?DBCC TRACEON(1204,-1)
Mark Storey-Smith

msdn.microsoft.com/zh-cn/library/ms188396.aspx:行为更改:在SQL Server 2000中,简单的DBCC TRACEON(1204)足以启用向错误日志的死锁报告。在SQL Server 2008中,必须全局启用该标志,因为会话级标志对于死锁监视器线程是不可见的。
Tevo D 2012年

2
@TevoD- 表示全局的-1参数DBCC TRACEON
马丁·史密斯

Answers:


25

您需要的数据记录在默认的扩展事件跟踪中。

DECLARE @xml XML

SELECT @xml = target_data
FROM   sys.dm_xe_session_targets
       JOIN sys.dm_xe_sessions
         ON event_session_address = address
WHERE  name = 'system_health'
       AND target_name = 'ring_buffer'

SELECT   
             XEventData.XEvent.query('(data/value/deadlock)[1]')  AS DeadlockGraph,
             CAST(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)') AS XML) AS DeadlockGraph,
              XEventData.XEvent.value('(./@timestamp)[1]', 'DATETIME2') AS [DateTime]
FROM   (SELECT @xml AS TargetData) AS Data
       CROSS APPLY 
       TargetData.nodes ('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData (XEvent) 
ORDER BY [DateTime] DESC

虽然如果您重新启动了该服务,它就不会再存在了,例如,应用了一个跟踪标志,或者在此期间缓冲区已循环。

您可以设置自己的扩展事件跟踪,该跟踪将死锁图存储到文件目标中以进行持久性非易失性存储。示例代码在这里。我个人发现死锁图XML比跟踪标志输出更友好。

编辑

  1. @MartinC在注释中指出,在没有所有更新的SQL Server实例上,生成无效XML可能存在问题。造成这种情况的解决方法是做一些搜索和替换,并使用CAST(REPLACE(REPLACE(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)'), '<victim-list>', '<deadlock><victim-list>'), '<process-list>', '</victim-list><process-list>') AS XML) AS DeadlockGraphSELECT列表如下描述
  2. 韦恩谢菲尔德张贴碎化的死锁图形的XML成表格格式的有用脚本这里

可悲的是,EE无法捕获所有死锁,并且似乎是一个错误:connect.microsoft.com/SQLServer/feedback/details/754115/…–
Matt

3

接受的答案并没有为我工作始终。显然已知环形缓冲区在某些情况下会丢弃事件。

ConnectItem

环形缓冲区问题

可以解析system_health日志事件文件(从此答案):

with XmlDeadlockReports as
(
  select convert(xml, event_data) as EventData
  from sys.fn_xe_file_target_read_file(N'system_health*.xel', NULL, NULL, NULL)
  where substring(event_data, 1, 50) like '%"xml_deadlock_report"%'  
) 
select EventData.value('(event/@timestamp)[1]', 'datetime2(7)') as TimeStamp,
       EventData.query('event/data/value/deadlock') as XdlFile
  from XmlDeadlockReports
 order by TimeStamp desc

XdlFile字段可以保存到.xdl文件并读入SSMS。已在Sql Server 2012中测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.