SET DEADLOCK_PRIORITY (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
См. также