1205: Транзакция (Process ID) оказалась во взаимоблокировке с другим процессом за ресурсы блокировки и выбрана жертвой взаимоблокировки
SQL ServerЧто это значит?
Две или более транзакции ждут блокировки, удерживаемые друг другом (взаимоблокировка). Чтобы разорвать цикл, SQL Server выбирает одну транзакцию жертвой и откатывает её.
Почему возникает?
Типичные причины — транзакции, блокирующие таблицы/строки в разном порядке, длительные транзакции, широкие сканирования из-за отсутствующих индексов, эскалация блокировок и высокая параллельность.
Как исправить
Перехватывайте ошибку 1205 в приложении и автоматически повторяйте транзакцию. В каждой транзакции обращайтесь к объектам в одном и том же порядке и делайте транзакции короткими. Изучите граф взаимоблокировки: для подробностей используйте Extended Events (сессия system_health) или trace flag 1222. Добавьте подходящие индексы, чтобы сократить сканирование и блокировки. При необходимости оцените уровень изоляции READ COMMITTED SNAPSHOT (RCSI).
Ещё по этой СУБД
- 2627Нарушение ограничения PRIMARY KEY / UNIQUE KEY. Невозможно вставить дублирующийся ключ в объект
- 2601Невозможно вставить строку с дублирующимся ключом в объект с уникальным индексом. Дублирующееся значение ключа: ...
- 547Оператор INSERT/UPDATE/DELETE конфликтует с ограничением FOREIGN KEY / CHECK
- 18456Ошибка входа для пользователя (Login failed)