DBAtlas · Атлас эксплуатации баз данных

1205: Транзакция (Process ID) оказалась во взаимоблокировке с другим процессом за ресурсы блокировки и выбрана жертвой взаимоблокировки

SQL Server

Что это значит?

Две или более транзакции ждут блокировки, удерживаемые друг другом (взаимоблокировка). Чтобы разорвать цикл, SQL Server выбирает одну транзакцию жертвой и откатывает её.

Почему возникает?

Типичные причины — транзакции, блокирующие таблицы/строки в разном порядке, длительные транзакции, широкие сканирования из-за отсутствующих индексов, эскалация блокировок и высокая параллельность.

Как исправить

Перехватывайте ошибку 1205 в приложении и автоматически повторяйте транзакцию. В каждой транзакции обращайтесь к объектам в одном и том же порядке и делайте транзакции короткими. Изучите граф взаимоблокировки: для подробностей используйте Extended Events (сессия system_health) или trace flag 1222. Добавьте подходящие индексы, чтобы сократить сканирование и блокировки. При необходимости оцените уровень изоляции READ COMMITTED SNAPSHOT (RCSI).

Открыть в DBAtlas →

Ещё по этой СУБД