代码之家  ›  专栏  ›  技术社区  ›  Mitkins Noldorin

尝试独占锁定前测试

  •  1
  • Mitkins Noldorin  · 技术社区  · 16 年前

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

    我假设如果返回了一行或多行,那么数据库必须在使用中。这是真的吗?还是不那么简单?

    更新 考虑到@gbn的评论,我决定使用以下语句强制回滚现有连接:

    ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    

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

    2 回复  |  直到 16 年前
        1
  •  2
  •   gbn    16 年前

    主要地,DB锁只是为了表明它正在使用中。与代码/表对象相比,数据库实际上没有很多排它锁情况。

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

    我将把alter数据库包装在一个try/catch块中,因为不能保证状态在check和alter db之间不会改变。

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

    编辑,基于注释

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

    • sys.dm_exec_connection S
    • sys.dm_exec_sessions
    • sys.dm_exec_requests

    老实说,很难停止自动统计更新或用户使用单一连接。通常情况下,您会这样做,断开所有其他用户的连接,而不需要等待…

    ALTER DATABASE MYDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    
        2
  •  0
  •   Lasse V. Karlsen    16 年前

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