Я исследую взаимоблокировку и использовал следующий запрос (который я получил из курса Pluralsight Джонатана Кехайяса по взаимоблокировкам) для извлечения информации из расширенных событий, касающихся взаимоблокировки:
SELECT
XEvent.query('data[@name="xml_report"]/value/deadlock') AS deadlock_graph
FROM (SELECT CAST([target_data] AS XML) AS TargetData
FROM sys.dm_xe_session_targets AS st
INNER JOIN sys.dm_xe_sessions AS s
ON [s].[address] = [st].[event_session_address]
WHERE [s].[name] = N'system_health'
AND [st].[target_name] = N'ring_buffer') AS Data
CROSS APPLY TargetData.nodes ('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData (XEvent);
Как ни странно, это дало мне набор результатов с 1 строкой и 1 столбцом, содержащий пустое значение. Немного покопавшись, я обнаружил, что это произошло из-за того, что часть XML-документа с графом взаимоблокировки, возвращаемая внутренним запросом, не была допустимым XML. Это выглядело так:
Как видите, все угловые скобки были заменены их кодировкой HTML. Я не понимаю, как это произошло, потому что все, что я делаю, это запрашиваю базу данных непосредственно из SSMS.
Как бы то ни было, как только я осознал проблему, я смог заменить все ошибочные значения правильными угловыми скобками, и мой XML стал действительным, и я смог изучить тупиковую ситуацию. Я нахожу это очень странным, но кто-нибудь знает, почему граф взаимоблокировок возвращается вот так?
Я должен отметить, что остальная часть XML (т. е. остальные события, кроме графа взаимоблокировки) вернулась в идеальном виде, как вы можете видеть здесь:
Вот моя информация о версии:
Microsoft SQL Server 2008 R2 (SP2) — 10.50.4000.0 (X64) 28 июня 2012 г. 08:36:30 Авторское право (c) Microsoft Corporation Enterprise Edition (64-разрядная версия) в Windows NT 6.1 (сборка 7601: пакет обновления 1) (гипервизор )
У кого-нибудь есть идея, что происходит? Я нахожу это довольно своеобразным.
заранее спасибо
Джейми