テーブルのロック状態を取得する方法(SQL Server)

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要

SQL Serverにおいて、テーブルのロック状態を調べるSQL文を記載する。


ロック状態を取得するSQL文

ロック状態を取得するには、以下のSQL文を実行すれば取得できる。

 SELECT resource_type AS type,
        resource_associated_entity_id as entity_id,
        (CASE WHEN resource_type = 'OBJECT' THEN
            OBJECT_NAME( resource_associated_entity_id )
         ELSE
            (SELECT OBJECT_NAME( OBJECT_ID ) FROM sys.partitions WHERE hobt_id=resource_associated_entity_id)
         END) AS object_name,
        request_mode AS request_mode,
        request_type AS request_type,
        request_status AS request_status,
        request_session_id AS session_id
 FROM
        sys.dm_tran_locks
 WHERE
        resource_type <> 'DATABASE'
 ORDER BY
        request_session_id


実行結果の例
type     entity_id  object_name  mode   type  status  session_id
OBJECT   90123845   test_table   IS     LOCK  GRANT   51



ロックの種類

ロックの種類を、下表に示す。

ロックのモード ロックの種類 説明
S 共有ロック 他のトランザクションからの読込は可能で、更新は不可となる。
X 排他ロック 他のトランザクションからの読込・更新が共に不可となる。
INSERT、UPDATE、DELETEを実行するとこのロックになる。
U 更新ロック 他のトランザクションからの読込は可能で、更新は不可となる。
SELECTでWITH(UPDLOCK)を指定するとこのロックになる。
IS インテント共有 下位の階層に位置するリソースの一部に対し、
要求されているかかけられている共有ロックを保護する。
IX インテント排他 下位の階層に位置するリソースの一部に対し、
要求されているかかけられている排他ロックを保護する。
IXはISのスーパーセットであり、下位のリソースに対する共有ロックの要求を保護する。
SIX インテント排他の共有 下位の階層に位置するすべてのリソースに対し、
要求されているか掛けられている共有ロックを保護し、下位のリソースの一部のインテント排他ロックを保護する。
上位リソースで同時実行しているISロックは可能である。

例えば、テーブルに対しSIXロックを掛けると、変更中のページにインテント排他ロックが、
変更中の行に排他ロックが掛かる。

1つのリソースに対しては、1度に1つのSIXロックしか掛けられない。
その結果、他のトランザクションによってリソースが更新されることはなくなるが、
他のトランザクションはテーブルレベルのISロックをかけることで下位のリソースを読み取ることができる。
IU インテント更新 下位の階層に位置するすべてのリソースに対し、要求されているかかけられている更新ロックを保護する。
IUロックはページリソースに対してのみ使用する。
更新操作が発生すると、IUロックはIXロックに変換される。
SIU 共有インテント更新 SロックとIUロックを個別に掛けるか、同時に掛けるかして組み合わせたものである。
例えば、トランザクションでPAGLOCKヒントを指定してクエリを実行してから更新操作を実行する場合、
PAGLOCKヒントを指定したクエリでSロックを掛け、更新操作でIUロックを掛ける。
UIX 更新インテント排他 UロックとIXロックを個別に掛けるか、同時に掛けるかして組み合わせたものである。