我有一個大的報告,我的SQL服務器上運行。它需要幾分鐘的時間才能運行。我不希望用戶點擊兩次。由於我將整個過程包裝在一個事務中,我如何檢查表是否被事務鎖定?如果是這樣,我想返回一個錯誤消息,說「生成報告,請在幾分鐘後再試一次」。如何檢查是否有表被鎖定在SQL Server
這是如何實現的?
我有一個大的報告,我的SQL服務器上運行。它需要幾分鐘的時間才能運行。我不希望用戶點擊兩次。由於我將整個過程包裝在一個事務中,我如何檢查表是否被事務鎖定?如果是這樣,我想返回一個錯誤消息,說「生成報告,請在幾分鐘後再試一次」。如何檢查是否有表被鎖定在SQL Server
這是如何實現的?
更好的是,考慮爲此設計的sp_getapplock
。或者使用SET LOCK_TIMEOUT
否則,你必須做一些sys.dm_tran_locks
,我只用於DBA的東西:不是用戶定義的併發。
您可以使用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
如果您如果應用在桌子或不鎖覈實,請嘗試以下查詢。
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()
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
SET LOCK_TIMEOUT是 – 2009-10-02 22:02:14
確實設置LOCK_TIMEOUT工作,如果使用NOLOCK最好的解決辦法...? – gbn 2009-10-03 13:34:42