Вы когда-нибудь сталкивались с сообщением об ошибке “База данных используется, не удается получить исключительную блокировку” при попытке восстановить базу данных в SQL Server? Эта проблема может быть довольно раздражающей, особенно когда вы уже завершили все пользовательские сеансы и остановили приложение, но проблема все равно остается.
В этой статье мы рассмотрим причину этой проблемы и предоставим пошаговое руководство по ее устранению.
Орфанная транзакция с SPID -2
При дальнейшем исследовании вы можете обнаружить, что орфанная транзакция с SPID -2 выполняется над базой данных, что мешает выполнению операции восстановления с получением исключительной блокировки. Этот сценарий довольно редок, но когда он возникает, он может вызывать серьезные проблемы, блокируя другие транзакции.
Попытка уничтожить этот отрицательный SPID с помощью обычной команды KILL приведет к сообщению об ошибке:
Msg 6101, Level 16, State 1, Line 1
Идентификатор процесса <SPID Number> не является допустимым идентификатором процесса. Выберите число от 1 до 2048
Эта ошибка возникает потому, что отрицательный SPID связан с идентификатором орфанной распределенной транзакции. Чтобы устранить эту проблему, вам нужно найти номер UnitOfWork (UOW), связанный с отрицательным SPID, и уничтожить его.
Устранение проблемы
Следуйте этим шагам, чтобы найти и уничтожить номер UOW:
Шаг 1: Найти номер UOW
Выполните следующий запрос, чтобы получить номер UOW, связанный с отрицательным SPID:
SELECT req_transactionUOW FROM master..syslockinfo WHERE req_spid = <SPID Number>
Убедитесь, что заменили <SPID Number> на фактический отрицательный SPID.
Шаг 2: Уничтожить номер UOW
Скопируйте номер UOW, полученный на шаге 1, и используйте его в команде KILL для завершения отрицательного SPID:
KILL '<UOW Number>'
Если с одним отрицательным SPID связано несколько номеров UOW, повторите этот шаг для каждого номера UOW.
Если эти шаги не помогают устранить проблему или вы не можете найти никаких номеров UOW, возможно, вам придется перезапустить службу SQL и службу MS DTC.
Стоит отметить, что если вы часто сталкиваетесь с этой проблемой, рекомендуется обратиться к команде разработчиков вашего приложения для анализа кода. Они могут помочь выявить любые скрытые проблемы в коде приложения, которые могут вызывать орфанские транзакции.
Мы надеемся, что эта статья помогла вам ясно понять проблему “База данных используется, не удается получить исключительную блокировку” в SQL Server и как ее устранить. Следуя описанным выше шагам, вы сможете успешно восстановить свою базу данных без дополнительных прерываний.
Для получения более информативных статей о SQL Server подписывайтесь на нас в Facebook по адресу http://www.facebook.com/mssqlfun.
Ссылка: Рохит Гарг (http://mssqlfun.com/)