代码之家  ›  专栏  ›  技术社区  ›  Byron Whitlock

如何检查SQL Server中是否锁定了表

  •  15
  • Byron Whitlock  · 技术社区  · 15 年前

    我有一个在SQL Server上运行的大型报表。跑步需要几分钟。我不希望用户单击“运行”两次。由于我将整个过程包装在事务中,如何检查表是否被事务锁定?如果是这样,我将返回一条错误消息,说明“报告生成,请在几分钟后重试”。

    这是怎么做到的?

    4 回复  |  直到 8 年前
        1
  •  10
  •   gbn    15 年前

    更好的是,考虑一下 sp_getapplock 是为这个设计的。或使用 SET LOCK_TIMEOUT

    否则,你就得做点什么 sys.dm_tran_locks 我只会将其用于DBA方面:而不是用于用户定义的并发性。

        2
  •  17
  •   RRUZ    11 年前

    您可以使用 sys.dm_tran_locks 视图,它返回有关当前活动的锁管理器资源的信息。

    试试这个

     SELECT 
         SessionID = s.Session_id,
         resource_type,   
         DatabaseName = DB_NAME(resource_database_id),
         request_mode,
         request_type,
         login_time,
         host_name,
         program_name,
         client_interface_name,
         login_name,
         nt_domain,
         nt_user_name,
         s.status,
         last_request_start_time,
         last_request_end_time,
         s.logical_reads,
         s.reads,
         request_status,
         request_owner_type,
         objectid,
         dbid,
         a.number,
         a.encrypted ,
         a.blocking_session_id,
         a.text       
     FROM   
         sys.dm_tran_locks l
         JOIN sys.dm_exec_sessions s ON l.request_session_id = s.session_id
         LEFT JOIN   
         (
             SELECT  *
             FROM    sys.dm_exec_requests r
             CROSS APPLY sys.dm_exec_sql_text(sql_handle)
         ) a ON s.session_id = a.session_id
     WHERE  
         s.session_id > 50
    
        3
  •  8
  •   user1897277    10 年前

    如果您正在验证是否对表应用了锁,请尝试下面的查询。

    SELECT resource_type, resource_associated_entity_id,
        request_status, request_mode,request_session_id,
        resource_description, o.object_id, o.name, o.type_desc 
    FROM sys.dm_tran_locks l, sys.objects o
    WHERE l.resource_associated_entity_id = o.object_id
        and resource_database_id = DB_ID()
    
        4
  •  3
  •   Naruto    8 年前

    系统dm_tran_locks 包含会话的锁定信息

    如果要知道特定表是否被锁定,可以使用以下查询

    SELECT 
     * 
    from 
     sys.dm_tran_locks 
    where 
      resource_associated_entity_id = object_id('schemaname.tablename')
    

    如果您有兴趣同时查找用户的登录名和正在运行的查询

    SELECT
     DB_NAME(resource_database_id)
     , s.original_login_name
     , s.status
     , s.program_name
     , s.host_name
     , (select text from sys.dm_exec_sql_text(exrequests.sql_handle))
     ,*
    from
      sys.dm_tran_locks dbl
         JOIN sys.dm_exec_sessions s ON dbl.request_session_id = s.session_id
      INNER JOIN  sys.dm_exec_requests exrequests on dbl.request_session_id = exrequests.session_id
    where
     DB_NAME(dbl.resource_database_id) = 'dbname'
    

    了解更多信息 locking query

    关于的更多信息 sys.dm_tran_locks