MSSQLSERVER_1205

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Сведения

Атрибут Значение
Название продукта SQL Server
ИД события 1205
Источник событий MSSQLSERVER
Компонент SQLEngine
Символическое имя LK_VICTIM
Текст сообщения Транзакция (с идентификатором процесса %d) вызвала взаимоблокировку ресурсов %.*ls с другим процессом и была выбрана в качестве жертвы для ее разрешения. Запустите транзакцию повторно.

Описание

Доступ к ресурсам осуществляется в конфликтном порядке в отдельных транзакциях, из-за чего возникает взаимоблокировка. Например:

  • Транзакция1 обновляет строку Таблица1.Строка1, в то время как транзакция2 обновляет строку Таблица2.Строка2.
  • Transaction1 пытается обновить Table2.Row2, но заблокирован, так как Транзакция2 еще не зафиксирована и не выпустила свои блокировки
  • Транзакция2 теперь пытается обновить Table1.Row1, но заблокирован, так как Транзакция1 не зафиксирована и не выпустила свои блокировки
  • Взаимоблокировка происходит из-за того, что транзакция1 ожидает завершения транзакции2, а транзакция2 ожидает завершения транзакции1.

Система обнаруживает эту взаимоблокировку и выбирает одну из транзакций в качестве "жертвы". Затем она выдает это сообщение, выполняя откат этой транзакции. Подробные сведения см. в разделе "Взаимоблокировки".

Действие пользователя

Взаимоблокировки в большинстве случаев связаны с приложениями и требуют от разработчиков приложений изменения кода. Один из подходов при получении ошибки 1205 заключается в повторном выполнении запросов. В этом блоге показано, как повторить попытку — обработать взаимоблокировку и повторно выполнить запрос: приложение симулятора взаимоблокировки для разработчиков: обработка проблемы взаимоблокировки SQL в приложении

Во избежание взаимоблокировок можно изменить выполняемое приложение. Выбранную «жертвой» транзакцию можно выполнить повторно, вероятность ее успешного выполнения высока и зависит от того, какие операции выполнялись одновременно.

Для предотвращения взаимоблокировок можно сделать так, чтобы транзакции обращались к строкам в одном и том же порядке (Таблица1, затем — Таблица2). При таком подходе могут возникнуть блокировки, но не взаимоблокировка.

Дополнительные сведения см. в разделе "Обработка взаимоблокировок " и "Минимизация взаимоблокировок".