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