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

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
2021年11月24日 (水) 18:06時点におけるWiki (トーク | 投稿記録)による版 (文字列「</source>」を「</syntaxhighlight>」に置換)
ナビゲーションに移動 検索に移動

概要

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


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

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

<source lang="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
</syntaxhighlight>


実行結果の例
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ロックを個別に掛けるか、同時に掛けるかして組み合わせたものである。