Блокировка транзакций (SQL Server + EF5) - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь отладить проблему с производительностью в приложении ASP.NET с использованием .NET 4.5, EF5 (с кэшем 2-го уровня и отложенной загрузкой навигационных свойств) и SQL Server 2014. Мы испытываем ряд блокировок ожидания вSQL сервер.Когда я смотрю на транзакции блокировки, они содержат очень быстрое ОБНОВЛЕНИЕ, а затем очень большой SELECT.ОБНОВЛЕНИЕ якобы является необходимым, но меня смущает вопрос, почему SELECT запускается в одной и той же транзакции (и почему что-то вообще выбирается).Фундаментальная проблема заключается в том, что таблица, на которую ссылается инструкция UPDATE, заблокирована на время выполнения инструкции SELECT.

Мы используем шаблон репозитория для получения данных из базы данных, а DbContext.SaveChanges () для фиксации изменений.Я не могу понять, как это возможно, что EF производит транзакцию, где есть и запись, и чтение, и я не получаю релевантные результаты, когда пытаюсь выполнить поиск в Google.

У нас есть несколько интерфейсов в системе, а также несколько консольных приложений, работающих с базой данных, но все они проходят одинаковую настройку / версии .NET и EF.

Я полагаю, что это должно быть через SaveChanges, так как это (AFAIK) единственный раз, когда вещи записываются в базу данных.

Есть ли у кого-нибудь здесь подсказка о том, как эти транзакции блокировки могут быть произведены?

1 Ответ

0 голосов
/ 06 февраля 2019

Фундаментальная проблема заключается в том, что таблица, на которую ссылается инструкция UPDATE, заблокирована на время выполнения инструкции SELECT.

Ответ на ваш вопрос:

SELECT выполняется в той же транзакции

X Блокировка всегда удерживается до конца transaction, то есть до тех пор, пока он не подтвердит или не откатится.Поэтому, если после вашего быстрого update будет длинный select, все, что update заблокировано в вашей таблице, останется заблокированным до тех пор, пока не закончится ваш select.

Вы можете разделить свои update и select если позволяют ваши бизнес-правила, вы можете добавить соответствующий index в обновленную таблицу, чтобы заблокировать только некоторые строки, а не всю таблицу, или вы можете оптимизировать select для более быстрого выполнения.

...