SQLサーバーで実行している大きなレポートがあります。実行には数分かかります。ユーザーが2回クリックすることは望ましくありません。トランザクション全体の手順をラップしているため、テーブルがトランザクションによってロックされているかどうかを確認するにはどうすればよいですか?その場合は、「レポートを生成しています。数分後にもう一度試してください」というエラーメッセージを返します。
どうすればこれを達成できますか?
さらに良いのは、 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'
詳細情報 ロッククエリ