sys.dm_tran_locks (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric のウェアハウス
SQL Server で現在アクティブなロック マネージャー リソースに関する情報を返します。 各行は、ロック マネージャーに対して現在アクティブになっている要求を示しています。この要求は、許可されたロックまたは許可を待機しているロックに対するものです。
結果セットの列は、リソースと要求の 2 つの主要グループに分けられます。 リソース グループは、ロック要求が出されているリソースを示し、要求グループはロック要求を示します。
Note
これを Azure Synapse Analytics または Analytics Platform System (PDW) から呼び出すには、 sys.dm_pdw_nodes_tran_locks
という名前を使用します。 この構文は、Azure Synapse Analytics のサーバーレス SQL プールでサポートされていません。
列名 | データ型 | 説明 |
---|---|---|
resource_type |
nvarchar(60) | リソースの種類。 値は次のようになります。 DATABASE FILE OBJECT ページ KEY EXTENT RID (行 ID) アプリケーション METADATA HOBT (ヒープまたは B ツリー) ALLOCATION_UNIT XACT (トランザクション) OIB (オンライン インデックス ビルド) ROW_GROUP |
resource_subtype |
nvarchar(60) | resource_type のサブタイプを表します。 親型のサブタイプ以外のロックを保持せずにサブタイプ ロックを取得することは技術的に有効です。 サブタイプが異なると、互いに競合したり、サブタイプのない親型と競合したりすることはありません。 また、すべての種類のリソースにサブタイプが含まれるわけではありません。 |
resource_database_id |
int | リソースのスコープとなっているデータベースの ID。 ロック マネージャーによって処理されるすべてのリソースのスコープは、このデータベース ID に基づいて決定されます。 |
resource_description |
nvarchar (256) | 別のリソース列からは使用できない情報のみを含むリソースの説明。 |
resource_associated_entity_id |
bigint | リソースが関連付けられているデータベース内のエンティティの ID。 リソースの種類に応じて、オブジェクト ID、HOBT ID、またはアロケーション ユニット ID を指定できます。 |
resource_lock_partition |
Int | ロック リソースがパーティション分割されている場合の、ロック パーティションの ID。 パーティション分割されていないロック リソースの値は 0 。 |
request_mode |
nvarchar(60) | 要求のモード。 許可された要求については許可モード、待機中の要求については要求中モードになります。 NULL = リソースへのアクセスは許可されていません。 プレースホルダーとして機能します。 Sch-S (スキーマ安定性) = スキーマ要素に対するスキーマ安定性ロックがセッションで保持されている間、テーブルやインデックスなどのスキーマ要素が削除されないようにします。 Sch-M (スキーマ変更) = 指定したリソースのスキーマを変更するセッションで、保持する必要があります。 指定したオブジェクトが他のセッションによって参照されないようにします。 S (共有) = 保持しているセッションは、リソースへの共有アクセスを許可されます。 U (更新) = 最終的に更新される可能性があるリソースで取得された更新ロックを示します。 これは、後で更新される可能性があるリソースが複数のセッションによってロックされるとき、一般的な形式のデッドロックが発生するのを防止するために使用します。 X (排他) = 保持しているセッションは、リソースへの排他アクセスを許可されます。 IS (インテント共有) = ロック階層の下位リソースに対して S ロックを設定する意図を示します。 IU (インテント更新) = ロック階層の下位リソースに対して U ロックを設定する意図を示します。 IX (インテント排他) = ロック階層の下位リソースに対して X ロックを設定する意図を示します。 SIU (共有インテント更新) = ロック階層の下位リソースに対する更新ロックの取得を意図した、リソースへの共有アクセスを示します。 SIX (共有インテント排他) = ロック階層の下位リソースに対する排他ロックの取得を意図した、リソースへの共有アクセスを示します。 UIX (更新インテント排他) = ロック階層の下位リソースに対する排他ロックの取得を意図した、リソースでの更新ロックの保持を示します。 BU = 一括操作によって使われます。 RangeS_S (共有キー範囲と共有リソース ロック) = シリアル化可能な範囲スキャンを示します。 RangeS_U (共有キー範囲と更新リソース ロック) = シリアル化可能な更新スキャンを示します。 RangeI_N (挿入キー範囲と NULL リソース ロック) = 新しいキーをインデックスに挿入する前に範囲をテストするために使われます。 RangeI_S = RangeI_N と S ロックの重複によって作成されるキー範囲変換ロック。 RangeI_U = RangeI_N と U ロックの重複によって作成されるキー範囲変換ロック。 RangeI_X = RangeI_N と X ロックの重複によって作成されるキー範囲変換ロック。 RangeX_S = RangeI_N と RangeS_S ロックの重複によって作成されるキー範囲変換ロック。 ロック。 RangeX_U = RangeI_N と RangeS_U ロックの重複によって作成されるキー範囲変換ロック。 RangeX_X (排他キー範囲と排他リソース ロック) = これは、範囲内のキーを更新するときに使われる変換ロックです。 |
request_type |
nvarchar(60) | 要求の種類。 値は LOCK です。 |
request_status |
nvarchar(60) | この要求の現在の状態。 使用できる値は、GRANTED、CONVERT、WAIT、LOW_PRIORITY_CONVERT、LOW_PRIORITY_WAIT、または ABORT_BLOCKERS です。 低優先度の待機と中止ブロッカーについて詳しくは、「ALTER INDEX (Transact-SQL)」の low_priority_lock_wait に関するセクションをご覧ください。 |
request_reference_count |
smallint | 同じ要求元がこのリソースを要求した回数の概数。 |
request_lifetime |
int | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
request_session_id |
int | session_id 現在この要求を所有している 所有 session_id は、分散トランザクションとバインドされたトランザクションに対して変更される可能性があります。 -2 の値は、要求が孤立した分散トランザクションに属していることを示します。 -3 値は、要求が遅延復旧トランザクション (ロールバックが正常に完了できなかったために復旧時にロールバックが延期されたトランザクションなど) に属していることを示します。 |
request_exec_context_id |
int | 要求を現在所有するプロセスの、実行コンテキスト ID。 |
request_request_id |
int | request_id この要求を現在所有しているプロセスの (バッチ ID)。 この値は、トランザクションのアクティブな複数アクティブな結果セット (MARS) 接続が変更されるたびに変更されます。 |
request_owner_type |
nvarchar(60) | 要求を所有するエンティティの種類。 ロック マネージャーの要求は、さまざまな種類のエンティティで所有されます。 次のいずれかの値になります。 TRANSACTION = 要求はトランザクションが所有しています。 CURSOR = 要求はカーソルが所有しています。 SESSION = 要求はユーザー セッションが所有しています。 SHARED_TRANSACTION_WORKSPACE = 要求は、トランザクション ワークスペースの共有部分が所有しています。 EXCLUSIVE_TRANSACTION_WORKSPACE = 要求は、トランザクション ワークスペースの排他部分が所有しています。 NOTIFICATION_OBJECT = 要求は、内部 SQL Server コンポーネントによって所有されています。 このコンポーネントは、別のコンポーネントがロックの取得を待機しているときに、そのことを通知するようにロック マネージャーに要求しました。 FileTable 機能は、この値を使用するコンポーネントです。 注: 登録されたセッションのロックを保持するには、ワークスペースが内部的に使われます。 |
request_owner_id |
bigint | この要求の特定の所有者の ID。 トランザクションが要求の所有者である場合、この値にはトランザクション ID が含まれます。 FileTable が要求の所有者である場合、 request_owner_id には次のいずれかの値があります。
|
request_owner_guid |
uniqueidentifier | この要求の特定の所有者の GUID。 この値は、分散トランザクションの MS DTC GUID に対応する場合に、そのトランザクションによってのみ使用されます。 |
request_owner_lockspace_id |
nvarchar(32) | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 この値は、要求元のロック領域 ID を示します。 ロック領域 ID によって、2 つの要求元の間に互換性があり、互いに競合しないモードでロックを許可できるかどうかを判断できます。 |
lock_owner_address |
varbinary(8) | 要求を追跡するときに使用される内部データ構造のメモリ アドレス。 この列は、sys.dm_os_waiting_tasks の resource_address 列と結合できます。 |
pdw_node_id |
int | 適用対象: Azure Synapse Analytics、Analytics Platform System (PDW) このディストリビューションがオンになっているノードの識別子。 |
アクセス許可
SQL Server と SQL Managed Instance では、VIEW SERVER STATE
アクセス許可が必要です。
SQL Database の Basic、S0、S1 サービス対象、および Elastic Pool のデータベースの場合、サーバー管理者アカウント、Microsoft Entra 管理者アカウント、または ##MS_ServerStateReader##
サーバー ロールのメンバーシップが必要です。 他のすべての SQL Database サービス目標では、データベースに対する VIEW DATABASE STATE
アクセス許可または ##MS_ServerStateReader##
サーバー ロールのメンバーシップのいずれかが必要です。
SQL Server 2022 以降でのアクセス許可
サーバーに対する VIEW SERVER PERFORMANCE STATE アクセス許可が必要です。
解説
要求が許可された状態とは、要求元に対してリソースのロックが許可されたことを示します。 要求を待機している状態とは、その要求がまだ許可されていないことを示します。 次の待機要求の種類は、 request_status
列によって返されます。
要求変換の状態とは、要求元がリソース要求を既に許可されており、最初の要求からさらに上の段階の許可を現在待機中であることを示します。
要求待機の状態とは、要求元が現在、リソースに対して許可された要求を保持していないことを示します。
sys.dm_tran_locks
は内部ロック マネージャーのデータ構造から設定されるため、この情報を維持しても、通常の処理に余分なオーバーヘッドは発生しません。 ビューを具現化するには、ロック マネージャーの内部データ構造にアクセスする必要があります。 これによって、サーバーでの通常の処理にわずかな影響が生じることがありますが、 このような影響は重要ではなく、頻繁に使用されるリソースのみに影響します。 このビューのデータはアクティブなロック マネージャーの状態に対応しているので、データはいつでも変更される可能性があります。ロックが取得または解放されるときに、行が追加または削除されます。 このビューのクエリを実行するアプリケーションでは、ロック マネージャー構造の整合性を保護する性質のため、予期しないパフォーマンスが発生する可能性があります。 このビューには、履歴情報はありません。
2 つの要求は、すべてのリソース グループの行が等しい場合のみ、同じリソースに実行されます。
次のツールを使用すると、読み取り操作のロックを制御できます。
SET TRANSACTION ISOLATION LEVEL を使用すると、セッションに対するロックのレベルを指定できます。 詳細については、「SET TRANSACTION ISOLATION LEVEL (Transact-SQL)」を参照してください。
テーブル ヒントをロックすると、FROM 句内にあるテーブルの個別の参照に対してロックのレベルを指定できます。 構文と制限については、「テーブル ヒント (Transact-SQL)」をご覧ください。
1 つの session_id
で実行されているリソースに、複数のロックが付与されている場合があります。 1 つのセッションで実行されている異なるエンティティは、それぞれ同じリソースに対するロックを所有でき、sys.dm_tran_locks
によって返されるrequest_owner_type
列とrequest_owner_id
列に情報が表示されます。 同じ request_owner_type
の複数のインスタンスが存在する場合は、各インスタンスを区別するために request_owner_id
列が使用されます。 分散トランザクションの場合、 request_owner_type
列と request_owner_guid
列には、さまざまなエンティティ情報が表示されます。
たとえば、セッション S1 は Table1
の共有ロックを所有し、セッション S1 で実行されているトランザクション T1 は、 Table1
の共有ロックも所有します。 この場合、sys.dm_tran_locks
によって返されるresource_description
列には、同じリソースの 2 つのインスタンスが表示されます。 request_owner_type
列には、1 つのインスタンスがセッションとして、もう 1 つのインスタンスがトランザクションとして表示されます。 また、 resource_owner_id
列の値も異なります。
1 つのセッションで実行する複数のカーソルは区別できないため、1 つのエンティティとして扱われます。
session_id
値に関連付けられていない分散トランザクションは孤立したトランザクションであり、-2
のsession_id
値が割り当てられます。 詳細については、「KILL (Transact-SQL)」を参照してください。
Locks
ロックは、複数のトランザクションで同じ SQL Server リソースが同時に使用されるのを防ぐために、トランザクション中に読み取られたり変更されたりする行などにかけられます。 たとえば、あるトランザクションによってテーブルの行に排他 (X) ロックがかけられると、他のトランザクションはロックが解除されるまでその行を変更できません。 ロックを最小限にとどめるとコンカレンシーが向上し、パフォーマンスが向上します。
リソースの詳細
次の表に、 resource_associated_entity_id
列で表されるリソースの一覧を示します。
Note
ドキュメントでは、一般的にインデックスを参照して B ツリーという用語を使用します。 行ストア インデックスでは、データベース エンジンは B+ ツリーを実装します。 これは、メモリ最適化テーブルの列ストア インデックスまたはインデックスには適用されません。 詳細については、「SQL Server と Azure SQL のインデックスのアーキテクチャとデザイン ガイド」を参照してください。
次の表は、各リソースの種類に関連付けられるサブタイプの一覧です。
リソースのサブタイプ | 同期 |
---|---|
ALLOCATION_UNIT.BULK_OPERATION_PAGE | 一括操作で使用されるあらかじめ割り当てられたページ。 |
ALLOCATION_UNIT.PAGE_COUNT | 遅延削除操作での、アロケーション ユニットのページ数の統計。 |
DATABASE.BULKOP_BACKUP_DB | データベースのバックアップと一括操作。 |
DATABASE.BULKOP_BACKUP_LOG | データベース ログのバックアップと一括操作。 |
DATABASE.CHANGE_TRACKING_CLEANUP | 変更の追跡のクリーンアップ タスク。 |
DATABASE.CT_DDL | データベースおよびテーブルレベルの変更の追跡の DDL 操作。 |
DATABASE.CONVERSATION_PRIORITY | CREATE BROKER PRIORITY などの Service Broker のメッセージ交換の優先度操作。 |
DATABASE.DDL | データ定義言語 (DDL) 操作と、削除などのファイル グループ操作。 |
DATABASE.ENCRYPTION_SCAN | TDE 暗号化の同期。 |
DATABASE.PLANGUIDE | プラン ガイドの同期。 |
DATABASE.RESOURCE_GOVERNOR_DDL | ALTER RESOURCE POOL などのリソース ガバナー操作の DDL 操作。 |
DATABASE.SHRINK | データベースの圧縮操作。 |
DATABASE.STARTUP | データベースの起動を同期するときに使用します。 |
FILE.SHRINK | ファイルの圧縮操作。 |
HOBT.BULK_OPERATION | SNAPSHOT、READ COMMITTED、および行のバージョン管理を使用する READ COMMITTED の分離レベルでの、ヒープが最適化された一括読み込み操作と同時実行スキャン。 |
HOBT.INDEX_REORGANIZE | ヒープまたはインデックスの再構成操作。 |
OBJECT.COMPILE | ストアド プロシージャのコンパイル。 |
OBJECT.INDEX_OPERATION | インデックス操作。 |
OBJECT.UPDSTATS | テーブル上の統計の更新。 |
METADATA.ASSEMBLY | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.ASSEMBLY_CLR_NAME | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.ASSEMBLY_TOKEN | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.ASYMMETRIC_KEY | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.AUDIT | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.AUDIT_ACTIONS | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.AUDIT_SPECIFICATION | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.AVAILABILITY_GROUP | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.CERTIFICATE | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.CHILD_INSTANCE | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.COMPRESSED_FRAGMENT | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.COMPRESSED_ROWSET | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.CONVERSTATION_ENDPOINT_RECV | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.CONVERSTATION_ENDPOINT_SEND | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.CONVERSATION_GROUP | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.CONVERSATION_PRIORITY | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.CREDENTIAL | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.CRYPTOGRAPHIC_PROVIDER | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.DATA_SPACE | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.DATABASE | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.DATABASE_PRINCIPAL | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.DB_MIRRORING_SESSION | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.DB_MIRRORING_WITNESS | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.DB_PRINCIPAL_SID | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.ENDPOINT | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.ENDPOINT_WEBMETHOD | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.EXPR_COLUMN | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.EXPR_HASH | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.FULLTEXT_CATALOG | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.FULLTEXT_INDEX | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.FULLTEXT_STOPLIST | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.INDEX_EXTENSION_SCHEME | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.INDEXSTATS | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.INSTANTIATED_TYPE_HASH | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.MESSAGE | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.METADATA_CACHE | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.PARTITION_FUNCTION | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.PASSWORD_POLICY | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.PERMISSIONS | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.PLAN_GUIDE | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.PLAN_GUIDE_HASH | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.PLAN_GUIDE_SCOPE | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.QNAME | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.QNAME_HASH | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.REMOTE_SERVICE_BINDING | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.ROUTE | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.SCHEMA | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.SECURITY_CACHE | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.SECURITY_DESCRIPTOR | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.SEQUENCE | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.SERVER_EVENT_SESSIONS | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.SERVER_PRINCIPAL | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.SERVICE | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.SERVICE_BROKER_GUID | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.SERVICE_CONTRACT | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.SERVICE_MESSAGE_TYPE | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.STATS | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.SYMMETRIC_KEY | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.USER_TYPE | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.XML_COLLECTION | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.XML_COMPONENT | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
METADATA.XML_INDEX_QNAME | 単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。 |
次の表に、各リソースの種類の resource_description
列の形式を示します。
例
A. 他のツールでsys.dm_tran_locksを使用する
次の例では、更新操作が別のトランザクションによってブロックされたシナリオを処理します。 sys.dm_tran_locks
やその他のツールを使用すると、リソースのロックに関する情報が提供されます。
USE tempdb;
GO
-- Create test table and index.
CREATE TABLE t_lock
(
c1 int, c2 int
);
GO
CREATE INDEX t_lock_ci on t_lock(c1);
GO
-- Insert values into test table
INSERT INTO t_lock VALUES (1, 1);
INSERT INTO t_lock VALUES (2, 2);
INSERT INTO t_lock VALUES (3, 3);
INSERT INTO t_lock VALUES (4, 4);
INSERT INTO t_lock VALUES (5, 5);
INSERT INTO t_lock VALUES (6, 6);
GO
-- Session 1
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRAN
SELECT c1
FROM t_lock
WITH(holdlock, rowlock);
-- Session 2
BEGIN TRAN
UPDATE t_lock SET c1 = 10;
次のクエリでは、ロック情報が表示されます。 <dbid>
の値は、sys.databases
のdatabase_id
に置き換える必要があります。
SELECT resource_type, resource_associated_entity_id,
request_status, request_mode,request_session_id,
resource_description
FROM sys.dm_tran_locks
WHERE resource_database_id = <dbid>;
次のクエリでは、前のクエリからの resource_associated_entity_id
を使用してオブジェクトの情報を返します。 このクエリは、オブジェクトを含むデータベースに接続して実行する必要があります。
SELECT object_name(object_id), *
FROM sys.partitions
WHERE hobt_id=<resource_associated_entity_id> ;
次のクエリは、ブロック情報を示しています。
SELECT
t1.resource_type,
t1.resource_database_id,
t1.resource_associated_entity_id,
t1.request_mode,
t1.request_session_id,
t2.blocking_session_id
FROM sys.dm_tran_locks as t1
INNER JOIN sys.dm_os_waiting_tasks as t2
ON t1.lock_owner_address = t2.resource_address;
リソースを解放するには、トランザクションをロールバックします。
-- Session 1
ROLLBACK;
GO
-- Session 2
ROLLBACK;
GO
B. セッション情報をオペレーティング システム スレッドにリンクする
次の例では、 session_id
を Windows スレッド ID に関連付ける情報を返します。 スレッドのパフォーマンスは、Windows パフォーマンス モニターで監視できます。 このクエリは、現在スリープ状態の session_id
を返しません。
SELECT STasks.session_id, SThreads.os_thread_id
FROM sys.dm_os_tasks AS STasks
INNER JOIN sys.dm_os_threads AS SThreads
ON STasks.worker_address = SThreads.worker_address
WHERE STasks.session_id IS NOT NULL
ORDER BY STasks.session_id;
GO