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 比跟踪标志输出更友好。
编辑
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 DeadlockGraph
在SELECT
列表如下描述。接受的答案对我来说并不总是有效。显然,环形缓冲区在某些情况下会丢弃事件。
可以解析 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 中测试。