Эта ошибка возникает, когда Microsoft SQL Server обнаруживает взаимоблокировку. Взаимоблокировка возникает, когда каждый из двух (или более) процессов пытается получить доступ к ресурсу, заблокированному другим процессом. Так как каждый процесс запрашивает другой ресурс, ни один из процессов не может завершиться. При обнаружении взаимоблокировки SQL Server выполняет откат команды с наименьшим временем обработки и возвращает клиентскому приложению сообщение об ошибке 1205. Эта ошибка не является неустранимой и не обязательно вызывает прекращение выполнения пакета.
Эта ошибка возникает, когда 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"
Эти сведения о взаимоблокировке можно интерпретировать следующим образом.:
В первом разделе отображается цель взаимоблокировки и время взаимоблокировки вместе с разделами, вовлеченными в данную взаимоблокировку. Для каждого сеанса отображаются текущий код SPID, тип инструкции и часть входного буфера.
Во втором разделе отображаются сведения о блокировках, вовлеченных в данную взаимоблокировку. В приведенных выше выходных данных обратите внимание на то, что взаимоблокировка включает блокировки ключей в таблице t1 с индексом i1. В выходных данных взаимоблокировки указывается, какие процессы владеют вовлеченными в нее взаимоблокировками и какие сеансы ожидают предоставления блокировок, а также связанные режимы блокировок.
Процесс, создавший том журнала наименьшего размера, по умолчанию выбирается в качестве цели взаимоблокировки. Его откат выполняется автоматически. Чтобы повлиять на выбор сеансов для отката, задайте для них параметр DEADLOCK_PRIORITY.
Имя | Описание | Значение по умолчанию |
Включено | Включает или отключает рабочий процесс. | Да |
Интервал (в секундах) | Повторяющийся интервал времени в секундах, в который следует запустить рабочий процесс. | 300 |
Приоритет | Определение приоритета оповещений. | 1 |
Важность | Определяет серьезность предупреждения. | 1 |
Время синхронизации | Время синхронизации |
|
Время ожидания (в секундах) | Указывает время, в течение которого рабочий процесс должен быть запущен, прежде чем он будет закрыт и отмечен как завершившийся сбоем. | 200 |
Время ожидания для подключения к базе данных (секунды) | Рабочий процесс завершится ошибкой и зарегистрирует событие, если он не сможет получить доступ к базе данных за указанный промежуток времени. | 15 |
Target | Microsoft.SQLServer.Linux.DBEngine | ||
Category | EventCollection | ||
Enabled | True | ||
Alert Generate | True | ||
Alert Severity | Warning | ||
Alert Priority | Normal | ||
Remotable | True | ||
Alert Message |
| ||
Comment | Mom2017ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2017GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74} |
ID | Module Type | TypeId | RunAs |
---|---|---|---|
_F6DA1507_12AF_11D3_AB21_00A0C98620CE_ | DataSource | Microsoft.SQLServer.Linux.DataSource.EventCollectionFiltered | Default |
GenerateAlert | WriteAction | System.Health.GenerateAlert | Default |
<Rule ID="Microsoft.SQLServer.Linux.EventRule.DBEngine.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule" Target="SqlDiscL!Microsoft.SQLServer.Linux.DBEngine" Enabled="true" ConfirmDelivery="true" Remotable="true" Comment="Mom2017ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2017GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}">
<Category>EventCollection</Category>
<DataSources>
<DataSource ID="_F6DA1507_12AF_11D3_AB21_00A0C98620CE_" Comment="{F6DA1507-12AF-11D3-AB21-00A0C98620CE}" TypeID="Microsoft.SQLServer.Linux.DataSource.EventCollectionFiltered">
<MachineName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/MachineName$</MachineName>
<NetbiosComputerName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/NetbiosComputerName$</NetbiosComputerName>
<InstanceName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/InstanceName$</InstanceName>
<ConnectionString>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/ConnectionString$</ConnectionString>
<InstanceVersion>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/Version$</InstanceVersion>
<InstanceEdition>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/Edition$</InstanceEdition>
<SqlExecTimeoutSeconds>60</SqlExecTimeoutSeconds>
<SqlTimeoutSeconds>15</SqlTimeoutSeconds>
<TimeoutSeconds>200</TimeoutSeconds>
<IntervalSeconds>300</IntervalSeconds>
<SyncTime/>
<EventDisplayNumber>1205</EventDisplayNumber>
</DataSource>
</DataSources>
<WriteActions>
<WriteAction ID="GenerateAlert" TypeID="Health!System.Health.GenerateAlert">
<Priority>1</Priority>
<Severity>1</Severity>
<AlertMessageId>$MPElement[Name="Microsoft.SQLServer.Linux.EventRule.DBEngine.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>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/MachineName$</AlertParameter1>
<AlertParameter2>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/InstanceName$</AlertParameter2>
<AlertParameter3>Event ID: $Data/Property[@Name='EventID']$. $Data/Property[@Name='Message']$</AlertParameter3>
</AlertParameters>
<Suppression>
<SuppressionValue/>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>