Я написал некоторый код для обновления базы данных SQL Server. Перед обновлением базы данных я получаю эксклюзивную блокировку через:
ALTER DATABASE Test SET SINGLE_USER WITH NO_WAIT
Однако я хотел бы проверить базу данных, чтобы увидеть, возможна ли эксклюзивная блокировка до . Я запускаю приведенный выше код. Тест не должен быть идеальным на 100%, я просто хотел бы избежать возможности тайм-аута при попытке получить эксклюзивную блокировку.
Для этого я написал следующий код:
SELECT
*
FROM
sys.db_tran_locks
WHERE
resource_database_id = DB_ID('Test') AND
request_session_id <> @@SPID
Я предполагаю, что если возвращена 1 или более строк, то база данных должна использоваться. Это правда? Или это не так просто?
ОБНОВЛЕНИЕ Принимая во внимание комментарии @ gbn, я решил принудительно откатить существующие соединения, используя следующее утверждение:
ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE
Перед запуском этого кода я дам пользователю возможность отказаться. Однако я бы хотел, чтобы пользователь мог видеть список активных подключений к базе данных, чтобы он мог принять обоснованное решение. Что приводит меня к этому вопросу.