テーブルのロック状態を取得する方法(SQL Server)
ナビゲーションに移動
検索に移動
概要
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ロックを個別に掛けるか、同時に掛けるかして組み合わせたものである。 |