MSSQL 2014: произошла взаимоблокировка ресурсов транзакции с другим процессом и она была выбрана в качестве жертвы взаимоблокировки. Снова запустите транзакцию

Microsoft.SQLServer.2014.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule (Rule)

Эта ошибка возникает, когда Microsoft SQL Server обнаруживает взаимоблокировку. Взаимоблокировка возникает, когда каждый из двух (или более) процессов пытается получить доступ к ресурсу, заблокированному другим процессом. Так как каждый процесс запрашивает другой ресурс, ни один из процессов не может завершиться. При обнаружении взаимоблокировки SQL Server выполняет откат команды с наименьшим временем обработки и возвращает клиентскому приложению сообщение об ошибке 1205. Эта ошибка не является неустранимой и не обязательно вызывает прекращение выполнения пакета.

Knowledge Base article:

Сводка

Эта ошибка возникает, когда Microsoft SQL Server обнаруживает взаимоблокировку. Взаимоблокировка возникает, когда каждый из двух (или более) процессов пытается получить доступ к ресурсу, заблокированному другим процессом. Так как каждый процесс запрашивает другой ресурс, ни один из процессов не может завершиться. При обнаружении взаимоблокировки SQL Server выполняет откат команды с наименьшим временем обработки и возвращает клиентскому приложению сообщение об ошибке 1205. Эта ошибка не является неустранимой и не обязательно вызывает прекращение выполнения пакета.

Решения

В некоторых экземплярах состояние взаимоблокировки вызывает функцию DB-Library (например dbsqlexec, dbsqlok, dbresults или dbnextrow ) для возврата значения FAIL. Программа несет ответственность за проверку кодов возврата из функции DB-Library. Если возвращается код FAIL одной из указанных функций DB-Library, программа должна прервать выполнение пакета и не предпринимать попыток к возобновлению. В некоторых случаях существует возможность продолжить выполнение последующих функций в пакете. Тем не менее, из-за ситуации взаимоблокировки функции, которые вызвали ее, были откачены, то последующие функции в пакете вероятно, будут завершены с более серьезной ошибкой, такой как "Объект не найден".

В других ситуациях при возникновении состояния взаимоблокировки функция DB-Library не возвращает значение FAIL. В таких случаях программа должна проверить наличие сообщения об ошибке 1205 в обработчике сообщений и с помощью функции dbsetuserdata сообщить об этом приложению. Программа должна проверять индикатор взаимоблокировки после каждого вызова функций DB-Library и прерывать выполнение пакета при обнаружении взаимоблокировки.

Хотя отмена выполнения пакета после получения сообщения о взаимоблокировке 1205 может показаться ненужной, она необходима, так как сервер не всегда прекращает выполнение пакета в состоянии взаимоблокировки. Если выполнение пакета не отменено, то любая попытка отправки нового пакета может вызывать ошибку DB-Library 10038, "Ожидаются результаты".

Можно также воспользоваться инструкцией SET DEADLOCK_PRIORITY (LOW или NORMAL). Инструкция SET DEADLOCK_PRIORITY управляет поведением сеанса в случае взаимоблокировки. В случае значения LOW данный процесс будет предпочтительной целью взаимоблокировки. В случае значения NORMAL сеанс будет использовать метод обработки взаимоблокировки по умолчанию.

Если состояние взаимоблокировки сохраняется, часто полезно использовать флаг трассировки 1204 для сбора дополнительной информации. Флаг трассировки 1204 выводит цепочки взаимоблокировки и цель (см. следующий пример выходных данных):

*** Deadlock Detected *** == Process 7 chosen as deadlock victim == Deadlock Detected at: 1998—09—10 16:39:29.17 == Session participant information: SPID: 7 ECID: 0 Statement Type: UPDATE Input Buf: update t1 set c1 = c1 where c1 = 2 SPID: 8 ECID: 0 Statement Type: UPDATE Input Buf: update t1 set c1 = c1 where c1 = 1 == Deadlock Lock participant information: == Lock: KEY: 2:117575457:1 (010001000000) Database: tempdb Table: t1 Index: i1 — Held by: SPID 7 ECID 0 Mode "S" — Requested by: SPID 8 ECID 0 Mode "X" == Lock: KEY: 2:117575457:1 (020002000000) Database: tempdb Table: t1 Index: i1 — Held by: SPID 8 ECID 0 Mode "S" — Requested by: SPID 7 ECID 0 Mode "X"

Эти сведения о взаимоблокировке можно интерпретировать следующим образом.:

Переопределяемые параметры

Название

Описание

Значение по умолчанию

Включено

Включает или отключает рабочий процесс.

Да

Приоритет

Определяет приоритет предупреждения.

1

Серьезность

Определяет серьезность предупреждения.

1

Element properties:

TargetMicrosoft.SQLServer.2014.DBEngine
CategoryEventCollection
EnabledTrue
Event_ID1205
Event Source$Target/Property[Type="SQL2014Core!Microsoft.SQLServer.2014.DBEngine"]/ServiceName$
Alert GenerateTrue
Alert SeverityWarning
Alert PriorityNormal
RemotableTrue
Alert Message
MSSQL 2014: произошла взаимоблокировка ресурсов транзакции с другим процессом и она была выбрана в качестве жертвы взаимоблокировки. Снова запустите транзакцию
{0}
Event LogApplication
CommentMom2014ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2014GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}

Member Modules:

ID Module Type TypeId RunAs 
_F6DA1507_12AF_11D3_AB21_00A0C98620CE_ DataSource Microsoft.Windows.EventProvider Default
GenerateAlert WriteAction System.Health.GenerateAlert Default

Source Code:

<Rule ID="Microsoft.SQLServer.2014.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule" Target="SQL2014Core!Microsoft.SQLServer.2014.DBEngine" Enabled="true" ConfirmDelivery="true" Remotable="true" Comment="Mom2014ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2014GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}">
<Category>EventCollection</Category>
<DataSources>
<DataSource ID="_F6DA1507_12AF_11D3_AB21_00A0C98620CE_" Comment="{F6DA1507-12AF-11D3-AB21-00A0C98620CE}" TypeID="Windows!Microsoft.Windows.EventProvider">
<ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
<LogName>Application</LogName>
<Expression>
<And>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery>PublisherName</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value>$Target/Property[Type="SQL2014Core!Microsoft.SQLServer.2014.DBEngine"]/ServiceName$</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery>EventDisplayNumber</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value>1205</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
</And>
</Expression>
</DataSource>
</DataSources>
<WriteActions>
<WriteAction ID="GenerateAlert" TypeID="SystemHealth!System.Health.GenerateAlert">
<Priority>1</Priority>
<Severity>1</Severity>
<AlertMessageId>$MPElement[Name="Microsoft.SQLServer.2014.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule.AlertMessage"]$</AlertMessageId>
<AlertParameters>
<AlertParameter1>Event ID: $Data/EventDisplayNumber$. $Data/EventDescription$</AlertParameter1>
</AlertParameters>
<Suppression>
<SuppressionValue/>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>