Запрос на выборку с объединениями действительно может вызвать тупик.Одним из способов решения этой проблемы является выполнение запроса в SqlTransaction с использованием изоляции моментальных снимков.
using(SqlTransaction sqlTran = connection.BeginTransaction(IsolationLevel.Snapshot))
{
// Query goes here.
}
Может произойти взаимоблокировка, поскольку она блокирует каждую таблицу, соединяемую одну за другой, перед выполнением объединения.Если другой запрос имеет блокировку для таблицы, которую необходимо заблокировать для другого запроса, и наоборот, существует мертвая блокировка.С Snapshot Isolation запросы, которые только что читают из таблиц, не блокируют их.Целостность поддерживается, потому что чтение фактически выполняется из моментального снимка данных в момент начала транзакции.
Это может оказать негативное влияние на производительность, хотя из-за накладных расходов на необходимость создания моментальных снимков.В зависимости от приложения, может быть лучше не использовать изоляцию моментальных снимков, а вместо этого, если запрос не удается, перейдите в тупик, подождите немного и попробуйте снова.
Также может быть лучше попытаться выяснить это.почему возникают взаимоблокировки и изменить структуру базы данных и / или изменить приложение, чтобы предотвратить взаимоблокировки.Эта статья содержит больше информации.