Помилка тупикового блоку не повертає 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 Standard Edition.


Чи можете ви перезапустити послугу? Якщо вам вдасться відмовитись від служби, ви можете додати прапор 1204 сліду до параметрів запуску, щоб записати деталі тупику в журнал SQL Server. > 1204: Повертає ресурси та типи блокувань, що беруть участь у тупиковому стані, а також поточну команду, на яку впливає. >> Сфера застосування: лише глобальна
Tevo D

1
Використовуйте менеджер конфігурації. У розділі Служби SQL Server натисніть правою кнопкою миші та відкрийте властивості. Перейдіть на вкладку Додатково, параметри запуску. У вас будуть записи про розташування головних файлів бази даних тощо. Додайте ;-T1204для закінчення прапора сліду та перезапустіть службу.
Тево Д

4
Навіщо перезапускати послугу? DBCC TRACEON (1204, -1)
Марк Сторі-Сміт

З msdn.microsoft.com/en-us/library/ms188396.aspx : Зміни поведінки: У SQL Server 2000 простого DBCC TRACEON (1204) достатньо, щоб увімкнути звітність про тупик у журналі помилок. У SQL Server 2008 ви повинні увімкнути прапор у всьому світі, оскільки прапор рівня сеансу не видно потоку монітора тупикового зв'язку.
Тево Д

2
@TevoD - -1Параметр для DBCC TRACEONпозначення глобальний.
Мартін Сміт

Відповіді:


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

Хоча його більше не буде, якщо ви перезапустили службу -eg, щоб застосувати прапор сліду або якщо буфер тим часом пройшов цикл.

Ви можете встановити свій власний розширений трасування подій, який зберігає графік тупикового кута до цільового файлу для стійкого нелетучого зберігання. Приклад коду тут . Я особисто вважаю, що графік тупикової 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 DeadlockGraphу SELECTсписку, як описано тут .
  2. Уейн Шеффілд опублікував корисний скрипт подрібнювати тупиковий граф XML в табличний формат тут .

На жаль, EE не фіксує всіх тупиків і, здається, є помилкою: connect.microsoft.com/SQLServer/feedback/details/754115/…
Метт

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.