2009-10-02 97 views
13

我有一個大的報告,我的SQL服務器上運行。它需要幾分鐘的時間才能運行。我不希望用戶點擊兩次。由於我將整個過程包裝在一個事務中,我如何檢查表是否被事務鎖定?如果是這樣,我想返回一個錯誤消息,說「生成報告,請在幾分鐘後再試一次」。如何檢查是否有表被鎖定在SQL Server

這是如何實現的?

回答

9

更好的是,考慮爲此設計的sp_getapplock。或者使用SET LOCK_TIMEOUT

否則,你必須做一些sys.dm_tran_locks,我只用於DBA的東西:不是用戶定義的併發。

+0

SET LOCK_TIMEOUT是 – 2009-10-02 22:02:14

+4

確實設置LOCK_TIMEOUT工作,如果使用NOLOCK最好的解決辦法...? – gbn 2009-10-03 13:34:42

16

您可以使用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 
5

如果您如果應用在桌子或不鎖覈實,請嘗試以下查詢。

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() 
2

sys.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' 

更多infomraton locking query

更多infor關於sys.dm_tran_locks

相關問題