Поделиться через


Анализируйте взаимоблокировки с помощью SQL Server Profiler

Используйте SQL Server Profiler, чтобы определить причину взаимоблокировки. Взаимоблокировка возникает, когда имеется циклическая зависимость между несколькими потоками или процессами для некоторого набора ресурсов в сервере SQL Server. С помощью SQL Server Profiler можно создать трассировку, которая записывает, воспроизводит и отображает события взаимоблокировки для анализа.

Для отслеживания событий взаимоблокировки добавьте класс событий Deadlock graph в трассировку. Этот класс событий заполняет столбец данных TextData в трассировке с данными XML о процессе и объектах, которые участвуют во взаимоблокировке. SQL Server Profiler может извлечь XML-документ в XML-файл взаимоблокировки (.xdl), который можно просмотреть позже в SQL Server Management Studio. Вы можете настроить SQL Server Profiler для извлечения событий графа Взаимоблокировки в один файл, содержащий все события графа Взаимоблокировки, или в отдельные файлы. Это извлечение можно выполнить одним из следующих способов.

  • Во время настройки трассировки используйте вкладку «Параметры извлечения событий». Обратите внимание, что эта вкладка не появляется, пока вы не выберете событие «Граф взаимоблокировки» на вкладке «Выбор событий».

  • Используя параметр Извлечение событий SQL Server в меню Файл.

  • Отдельные события можно также извлекать и сохранять, щелкнув правой кнопкой конкретное событие и выбрав Извлечь данные события.

Графы взаимоблокировок

SQL Server Profiler и SQL Server Management Studio используют граф ожидания взаимоблокировки, чтобы описать взаимоблокировку. Граф ожидания взаимоблокировки содержит узлы процессов, узлы ресурсов и ребра, представляющие связи между процессами и ресурсами. Компоненты графов ожидания определяются в следующей таблице:

Технологический узел
Поток, выполняющий задачу, например INSERT, UPDATE или DELETE.

Узел ресурсов
Объект базы данных, например таблица, индекс или строка.

Microsoft Edge
Связь между процессом и ресурсом. request Ребро возникает, когда процесс ожидает ресурс. owner Ребро возникает, когда процесс ожидает ресурс. В описание ребра включен режим блокировки. Например, Режим: X.

Взаимоблокировка узла процесса

В графе ожидания узел процесса содержит информацию о процессе. В следующей таблице поясняются компоненты процесса.

Компонент Определение
Идентификатор процесса сервера Идентификатор процесса сервера (SPID) — назначенный сервером идентификатор для процесса владения блокировкой.
Идентификатор пакета сервера Идентификатор пакета сервера (SBID).
Идентификатор контекста выполнения Идентификатор контекста выполнения (ECID). Идентификатор контекста выполнения заданного потока, связанного с определенным SPID.

ECID = {0,1,2,3, ...n}, где 0 всегда представляет основной или родительский поток, а {1,2,3, ...n} представляет подпроцессы.
Приоритет блокировки Приоритет взаимоблокировки для процесса. Дополнительные сведения о возможных значениях см. в статье SET DEADLOCK_PRIORITY (Transact-SQL).
Используемый журнал Объем пространства журнала, используемого для процесса.
Идентификатор владельца Идентификатор транзакции для процессов, которые используют транзакции и в настоящее время ожидают блокировки.
Дескриптор транзакции Указатель на дескриптор транзакции, описывающий состояние транзакции.
Входной буфер Входной буфер текущего процесса определяет тип события и выполняемую инструкцию. Возможные значения включают:

Язык

RPC

Нет
Заявление Тип заявления. Возможны следующие значения:

NOP

ВЫБИРАТЬ

ОБНОВЛЯТЬ

ВСТАВКА

УДАЛИТЬ

Неизвестный

Взаимоблокировка ресурса узла

Во взаимоблокировке участвуют два процесса, каждый их которых ожидает освобождения ресурса, удерживаемого другим процессом. В графе взаимоблокировки ресурсы отображаются как узлы ресурсов.