Блокировка базы данных Entity Framework / SQL Server - PullRequest
0 голосов
/ 25 февраля 2019

У меня проблемы с пониманием того, что блокирует мою базу данных SQL Server.Я обращаюсь к данным из базы данных SQL Server через Entity Framework.Во время работы этого веб-приложения я также проверяю данные с помощью SQL Server Management Studio.

Видимо, когда я пытаюсь прочитать разные таблицы, щелкнув правой кнопкой мыши "Выберите TOP n строк", я получаю сообщение

Не удалось получить данные - превышен период ожидания блокировки Ошибка 1222).

Этого не происходит, когда я читаю данные вручную с помощью оператора Select * from ... или, по крайней мере, я этого еще не заметил.Есть ли разница между этими двумя подходами?

И что более важно, как я могу выяснить, что блокирует мою базу данных?Я пытался проводить исследования, но все еще не совсем понимал, что делать.Я попытался использовать

DBCC opentran and than 
exec sp_who2 SPID
exec sp_lock SPID

, который говорит мне, что есть активная транзакция из Entity Framework, но не какая именно.Я использую несколько транзакций в моем приложении.Но это, по моему мнению, на других столах, чем я пытаюсь получить доступ через Management Studio.Эти транзакции блокируют всю базу данных?

Цените любую помощь.

enter image description here

1 Ответ

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

Попробуйте использовать отличную хранимую процедуру who_isActive, написанную Адамом Маханичем:

EXEC sp_WhoIsActive;

Кроме того, эта хранимая процедура показывает исполняемый текст sql.

Хранимая процедура может быть загружена здесь.

например, запрос с session_id = 75 ожидает запроса с session_id = 90: enter image description here

Thisявляется причиной вашей блокировки.

sp_who2 тоже отличная процедура.Например: enter image description here

Затем вы должны решить, должен ли этот процесс быть убит:

KILL YourNumberOfSessionID
...