SET DEADLOCK_PRIORITY (Transact-SQL)

Применимо: База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics (только бессерверный пул SQL)

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

Соглашения о синтаксисе Transact-SQL

Синтаксис

SET DEADLOCK_PRIORITY { LOW | NORMAL | HIGH | <numeric-priority> | @deadlock_var | @deadlock_intvar }
  
<numeric-priority> ::= { -10 | -9 | -8 | ... | 0 | ... | 8 | 9 | 10 }

Аргументы

Низкое

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

NORMAL

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

ВЫСОКИЙ УРОВЕНЬ

Указывает, что текущий сеанс будет выбран в качестве жертвы в случае взаимоблокировки с другим сеансом, если другой сеанс входит в цепочку взаимного блокирования с приоритетом, равным целочисленному значению больше 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, то экземпляр выберет в качестве жертвы сеанс, откат которого предположительно связан с меньшими затратами ресурсов. Затраты определяются путем сравнения количества байт журнала, записанных на данный момент в каждой транзакции. (Это значение обозначается как Log Used в графе взаимоблокировки.)

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

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

Этот синтаксис не поддерживается в выделенных пулах SQL в Azure Synapse Analytics. Он поддерживается в бессерверных пулах SQL в Azure Synapse Analytics.

Разрешения

Необходимо быть членом роли public.

Примеры

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

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

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

SET DEADLOCK_PRIORITY NORMAL;
GO

Следующие шаги