Обработка взаимоблокировок

Когда экземпляр Microsoft SQL Server Database Engine выбирает жертву взаимоблокировки, он определяет текущий пакет, откатывает транзакцию назад и возвращает приложению сообщение об ошибке с номером 1205.

Your transaction (process ID #52) was deadlocked on {lock | communication buffer | thread} resources with another process and has been chosen as the deadlock victim. Rerun your transaction.

Поскольку любое приложение, отправляющее запросы Transact-SQL, может быть выбрано в качестве жертвы взаимоблокировки, они должны содержать обработчик ошибок, перехватывающий ошибку 1205. Приложение, которое не обрабатывает эту ошибку, не будет знать о том, что произошел откат транзакции, и произойдет ошибка.

Благодаря обработчику ошибки 1205 приложение сможет справиться с взаимоблокировкой и предпринять действия по ее исправлению (например автоматически повторить запрос, который не был выполнен из-за взаимоблокировки). Если повторное выполнение запроса происходит автоматически, пользователю не обязательно знать о возникновении взаимоблокировки.

Прежде чем повторять запрос, следует приостановить приложение на короткое время. Это позволит второй участвующей транзакции закончить работу и освободить блокировки, которые частично создавали взаимоблокировку. Благодаря этому приложение минимизирует вероятность повторного возникновения взаимоблокировки при повторном выполнении запроса.