web-dev-qa-db-ja.com

SQL Serverでテーブルがロックされているかどうかを確認する方法

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

どうすればこれを達成できますか?

17
Byron Whitlock

さらに良いのは、 sp_getapplock このために設計されています。または SET LOCK_TIMEOUT

それ以外の場合は、 sys.dm_tran_locks これはDBAスタッフにのみ使用します。ユーザー定義の同時実行には使用しません。

10
gbn

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
19
RRUZ

テーブルにロックが適用されているかどうかを確認している場合は、以下のクエリを試してください。

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()
10
user1897277

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'

詳細情報 ロッククエリ

sys.dm_tran_locks の詳細

3
Naruto