Каждый оператор SQL DML (INSERT, UPDATE, DELETE) или DQL (SELECT) выполняется внутри транзакции. Поведение по умолчанию для SQL Server заключается в том, что он открывает новую транзакцию (если она не существует) и, если инструкция завершается без ошибок, автоматически фиксирует транзакцию.
Поведение IMPLICIT_TRANSACTIONS, о котором упоминает Сидхарт, в основном заставляет SQL Server несколько изменить свое поведение - оно оставляет транзакцию открытой после завершения инструкции.
Чтобы получить более подробную информацию в журнале ошибок SQL Server, вы можете включить флаг трассировки . Затем будет указано, какие соединения были задействованы в тупике (а не только тот, который был убит) и какие ресурсы были задействованы. После этого вы сможете определить, какой тип поведения ведет к тупикам.
Если вы не можете определить основную причину, вам, возможно, придется добавить дополнительный код в ваше приложение - оно отлавливает ошибки sql из-за взаимных блокировок и повторяет команду несколько раз. Обычно это последнее средство - лучше определить, какие таблицы / индексы задействованы, и разработать стратегию, которая в первую очередь избегает взаимоблокировок.