SET DEADLOCK_PRIORITY (Transact-SQL)

Определяет относительную важность продолжения обработки текущего сеанса, если произошла взаимоблокировка с другим сеансом.

Значок ссылки на раздел Синтаксические обозначения Transact-SQL

Синтаксис

SET DEADLOCK_PRIORITY { LOW | NORMAL | HIGH | <numeric-priority> | @deadlock_var | @deadlock_intvar }

<numeric-priority> ::= { -10 | -9 | -8 | … | 0 | … | 8 | 9 | 10 }

Аргументы

  • LOW
    Указывает, что текущий сеанс будет выбран в качестве жертвы взаимоблокировки, если он входит во взаимоблокировку, а другие сеансы, входящие в цепочку взаимоблокировок, имеют приоритет взаимоблокировки, установленный равным NORMAL или HIGH либо равным целочисленному значению больше -5. Текущий сеанс не будет выбран в качестве жертвы взаимоблокировки, если другие сеансы имеют приоритет взаимоблокировки, установленный равным целочисленному значению меньше -5. Также указывает, что текущий сеанс может быть выбран в качестве жертвы взаимоблокировки, если другой сеанс имеет значение приоритета, установленное в LOW или равное целочисленному значению -5.

  • NORMAL
    Указывает, что текущий сеанс будет выбран в качестве жертвы взаимоблокировки, если другие сеансы, входящие в цепочку взаимоблокировок, имеют приоритет взаимоблокировки, установленный равным HIGH или равным целочисленному значению больше 0, но не станет жертвой взаимоблокировки, если другим сеансам назначен приоритет взаимоблокировки, равный LOW или равный целочисленному значению меньше 0. Также указывает, что текущий сеанс может быть выбран в качестве жертвы взаимоблокировки, если другой сеанс имеет значение приоритета, установленное в NORMAL или равное целочисленному значению 0. Значение NORMAL является приоритетом по умолчанию.

  • HIGH
    Указывает, что текущий сеанс будет выбран в качестве жертвы в случае взаимоблокировки с другим сеансом, если другой сеанс входит в цепочку взаимного блокирования с приоритетом, равным целочисленному значению больше 5, или может быть выбран в качестве жертвы, если другому сеансу назначен приоритет HIGH или равный целочисленному значению 5.

  • <numeric-priority>
    Диапазон целочисленных значений [-10; 10], обеспечивающий 21 уровень приоритета взаимоблокировки. Указывает, что текущий сеанс будет выбран в качестве жертвы в случае взаимоблокировки с другим сеансом, если другой сеанс в цепочке взаимного блокирования имеет более высокое значение приоритета, но не будет выбран в качестве жертвы в случае конфликта с другим сеансом, если другой сеанс в цепочке взаимного блокирования имеет меньшее значение приоритета, чем текущий сеанс. Также указывает, что текущий сеанс может быть выбран в качестве жертвы в результате взаимоблокировки, если другой сеанс в цепочке взаимного блокирования имеет такое же значение приоритета, что и текущий сеанс. LOW соответствует значению -5, NORMAL — 0, HIGH — 5.

  • @ deadlock_var
    Символьная переменная, указывающая приоритет взаимоблокировки. Переменной должно быть присвоено значение LOW, NORMAL или HIGH. Переменная должна быть достаточно большой, чтобы вместить всю строку.

  • @ deadlock_intvar
    Целочисленная переменная, указывающая приоритет взаимоблокировки. Переменной должно быть назначено целочисленное значение в диапазоне от -10 до 10.

Замечания

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

Выбор сеанса в качестве жертвы зависит от приоритета взаимоблокировки:

  • Если у обоих сеансов одинаковый приоритет взаимоблокировки, то экземпляр SQL Server выбирает сеанс, откат которого как откат жертвы связан с меньшими затратами ресурсов. Например, если оба сеанса имеют приоритет взаимоблокировки HIGH, то экземпляр выберет в качестве жертвы сеанс, откат которого предположительно связан с меньшими затратами ресурсов.

  • Если приоритеты взаимоблокировки сеансов различны, то в качестве жертвы выбирается сеанс с более низким приоритетом взаимоблокировки.

Значение SET DEADLOCK_PRIORITY задается на этапе выполнения или запуска, но не на этапе синтаксического анализа.

Разрешения

Требует членства в роли public.

Примеры

В следующем примере используется переменная для присвоения приоритету взаимоблокировки значения LOW.

DECLARE @deadlock_var NCHAR(3);
SET @deadlock_var = N'LOW';

SET DEADLOCK_PRIORITY @deadlock_var;
GO

В следующем примере приоритету взаимоблокировки присваивается значение NORMAL.

SET DEADLOCK_PRIORITY NORMAL;
GO

См. также

Справочник

@@LOCK_TIMEOUT (Transact-SQL)

Инструкции SET (Transact-SQL)

SET LOCK_TIMEOUT (Transact-SQL)