死锁错误不返回死锁 SQL

web*_*oob 13 sql-server-2008 deadlock

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 标准版。

Mar*_*ith 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
Run Code Online (Sandbox Code Playgroud)

尽管如果您重新启动了服务(例如应用跟踪标志或缓冲区在此期间循环),它将不再存在。

您可以设置自己的扩展事件跟踪,将死锁图存储到文件目标以进行持久的非易失性存储。示例代码在这里。我个人认为死锁图 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. Wayne Sheffield在此处发布了一个有用的脚本,用于将死锁图 XML 分解为表格格式。


cro*_*sek 5

接受的答案对我来说并不总是有效。显然,环形缓冲区在某些情况下会丢弃事件。

连接项

环形缓冲区问题

可以解析 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
Run Code Online (Sandbox Code Playgroud)

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