Sql server 在尝试独占锁之前进行测试

Sql server 在尝试独占锁之前进行测试,sql-server,Sql Server,我已经编写了一些代码来升级SQL Server数据库。在升级数据库之前,我通过以下方式获得独占锁: ALTER DATABASE Test SET SINGLE_USER WITH NO_WAIT 但是,在运行上述代码之前,我想测试数据库,看看是否可以使用独占锁。测试不一定要100%完美,我只是想避免在尝试获得独占锁时超时的可能性 为此,我编写了以下代码: SELECT * FROM sys.db_tran_locks WHERE resource_databa

我已经编写了一些代码来升级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

在运行此代码之前,我将给用户一个选择退出的机会。但是,我希望用户能够看到数据库的活动连接列表,以便他们能够做出明智的决定。这让我想到了这个问题。

如果数据库从您确定它未被使用到您试图获取独占锁时变得繁忙,该怎么办?

主要来说,DB锁只是为了表明它正在使用。与代码/表对象相比,数据库实际上没有很多独占锁

单用户模式不是锁定,而是允许的连接数

我会将ALTER数据库包装在一个TRY/CATCH块中,因为不能保证check和ALTER DB之间的状态不会改变

然而,我可能错了或误解了这个问题。。。因此,您还必须在上面的查询中测试数据库资源的独占锁定模式。上面的代码将显示任何锁,可能是某人在SSMS中打开了一个空白查询窗口

根据评论进行编辑

您可以通过以下方式检测谁在使用它:

  • sys.dm\u exec\u连接
    s
  • sys.dm_exec_sessions
  • sys.dm_exec_请求
老实说,很难阻止自动统计更新或用户使用单一连接。通常情况下,你可以这样做,它会断开所有其他用户的连接,而不必等待

ALTER DATABASE MYDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

当然,没有什么可以阻止这一切的发生。但是,升级过程的一部分是让用户消除与数据库的连接。所以希望数据库不会很忙。在这种情况下,我要做的是确定是否可以将数据库减少到一个连接。有没有办法查询当前的连接集?
ALTER DATABASE MYDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE