По запросу в SQL Server 2016 появляется следующее сообщение об ошибке - Соединение ADO.NET
Исключительное сообщение: транзакция (ID процесса 358) заблокирована при блокировке |ресурсы буфера связи с другим процессом и были выбраны в качестве жертвы тупика.Повторите транзакцию.
SELECT * FROM Table2 WHERE EXISTS (
SELECT * FROM Table1
WHERE Id = '1234'
AND SourceId = Table1.[Id]);
Что может быть причиной проблемы?
Какова область блокировки совместного использования / чтения, которая создается при выполнении этого запроса?т.е. применяется ли общая блокировка ко всей таблице 2 или только к строкам в наборе результатов?(Я спрашиваю об этом, потому что это похоже на коррелированный подзапрос)
Поможет ли рефакторинг INNER JOIN?
SELECT t2.* FROM Table2 t2
INNER JOIN Table1 t1
ON t2.SourceId = b.Id
WHERE t1.Id = '1234'
Из журналов я не вижу других операторов обновления, обновляющих набор результатов(или таблица) +/- 10 секунд при возникновении ошибки.
Так будут ли тупики блокироваться несколькими пользователями, выполняющими один и тот же запрос?(в таблице нет некластеризованного индекса)
Поможет ли ускорение запроса с помощью стратегии индексирования помочь в ситуации взаимоблокировки?Таблица имеет 2 миллиона записей и не проиндексирована должным образом (она просто имеет первичный ключ (не SourceId)).Я вижу сканирование индекса в плане выполнения.Следовательно, добавление некластеризованного индекса в SourceId, охватывающего другие столбцы, помогает?Я вижу, что для структуры данных индекса потребуется дополнительно 400 МБ свободного места.Поэтому я не хотел бы в идеале сделать это.Поможет ли добавление некластеризованного индекса в SourceId (не покрывающего индекс)? (Из-за нехватки места)
Уровень изоляции по умолчанию для нашего приложения - Повторное чтение.Поможет ли ослабление уровня изоляции с помощью WITH (NOLOCK)?
Как узнать, какой другой оператор SQL конфликтует с этим?Можно ли запустить SQL Profiler в производственной базе данных для генерации графика DeadLock?
Что еще рекомендуется для выявления и устранения проблемы?