Работа с транзакцией (ID процесса) заблокирована при блокировке - PullRequest
0 голосов
/ 31 мая 2019

По запросу в 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?

Что еще рекомендуется для выявления и устранения проблемы?

1 Ответ

0 голосов
/ 31 мая 2019

Снижение уровня изоляции не помогает с заблокированным пользователем ..., но помогает другим пользователям, использующим заблокированные таблицы ... Снижение уровня изоляции до Read Uncommitted приводит к тому же эффекту с операторами No Lock в каждой таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...