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). При таком подходе могут возникнуть блокировки, но не взаимоблокировка.
Дополнительные сведения см. в разделе "Обработка взаимоблокировок " и "Минимизация взаимоблокировок".