適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric のウェアハウス
Microsoft Fabric の SQL データベース
SQL Server で現在アクティブなロック マネージャー リソースに関する情報を返します。 各行は、ロック マネージャーに対して現在アクティブになっている要求を示しています。この要求は、許可されたロックまたは許可を待機しているロックに対するものです。
結果セットの列は、リソースと要求の 2 つの主要グループに分けられます。 リソース グループは、ロック要求が出されているリソースを示し、要求グループはロック要求を示します。
注
これを Azure Synapse Analytics または Analytics Platform System (PDW) から呼び出すには、 sys.dm_pdw_nodes_tran_locksという名前を使用します。 この構文は、Azure Synapse Analytics のサーバーレス SQL プールでサポートされていません。
| 列名 | データの種類 | Description |
|---|---|---|
resource_type |
nvarchar(60) | リソースの種類。 値は次のようになります。DATABASEFILEOBJECTPAGEKEYEXTENTRID (列のID)APPLICATIONMETADATAHOBT (ヒープまたはBツリー)ALLOCATION_UNITXACT (取引)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 (Update) = 最終的に更新される可能性のあるリソースに対して取得された更新ロックを示します。 これは、後で更新される可能性があるリソースが複数のセッションによってロックされるとき、一般的な形式のデッドロックが発生するのを防止するために使用します。X (Exclusive) = ホールディングセッションがリソースへの排他アクセス権を付与されます。IS (意図共有)= Sロックをロック階層内の従位リソースに置く意図を示します。IU (意図更新) = はロック階層内の何らかの下位リソースにUのロックを配置する意図を示します。IX (意図除外) = ロック階層内の何らかの下位リソースにXつのロックを配置する意図を示します。SIU (共有意図更新) = ロック階層内の下位リソースに対して更新ロックを取得する意図で共有アクセスを示します。SIX (共有意図排他)= ロック階層内の下位リソースに対して排他的ロックを取得する意図で共有アクセスしていることを示します。UIX (Update Intent Exclusive) = リソースに対する更新ロックホールドを示し、ロック階層内の下位リソースに対して排他的ロックを取得する意図があります。BU = バルク操作で使用される。RangeS_S (共有 Key-Range および共有リソースロック) = シリアライズ可能な範囲スキャンを示します。RangeS_U (共有 Key-Range および更新リソースロック) = シリアライズ可能な更新スキャンを示します。RangeI_N (Insert Key-Range and Null Resource lock) = 新しいキーをインデックスに挿入する前に範囲をテストするために使われます。RangeI_S = Key-Range RangeI_N ロックと S ロックの重複によって作成される変換ロック。RangeI_U = Key-Range 変換ロックは、RangeI_NロックとUロックの重なりによって作成されます。RangeI_X = Key-Range RangeI_N ロックと X ロックの重複によって作成される変換ロック。RangeX_S = Key-Range RangeI_N と RangeS_Sの重なりによって生成される変換ロック。 ロック。RangeX_U = Key-Range RangeI_N ロックと RangeS_U ロックの重複によって作成される変換ロック。RangeX_X (排他的 Key-Range と排他的リソースロック) = これはレンジ内のキーを更新する際に使われる変換ロックです。 |
request_type |
nvarchar(60) | 要求の種類。 値は LOCK です。 |
request_status |
nvarchar(60) | この要求の現在の状態。 可能な値は GRANTED、CONVERT、WAIT、LOW_PRIORITY_CONVERT、LOW_PRIORITY_WAIT、または ABORT_BLOCKERS です。 低優先度の待機や中止ブロッカーについての詳細は、のALTER INDEXセクション(Transact-SQL)をご覧ください。 |
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) | 要求を追跡するときに使用される内部データ構造のメモリ アドレス。 この列は、resource_addressの sys.dm_os_waiting_tasks 列と結合できます。 |
pdw_node_id |
int | このディストリビューションがオンになっているノードの識別子。 適用対象: Azure Synapse Analytics、Analytics Platform System (PDW) |
Permissions
SQL ServerとSQL Managed Instanceでは、sys.dm_tran_locksVIEW SERVER STATE許可が必要です。
SQL Database の Basic、S0、S1 サービス対象、および Elastic Pool のデータベースの場合、サーバー管理者アカウント、Microsoft Entra 管理者アカウント、または ##MS_ServerStateReader##サーバー ロールのメンバーシップが必要です。 他のすべての SQL Database サービス目標では、データベースに対する VIEW DATABASE STATE アクセス許可または ##MS_ServerStateReader## サーバー ロールのメンバーシップのいずれかが必要です。
Microsoft FabricのSQLアナリティクスエンドポイントおよびWarehouseでは、ビューアワークスペースの役割のメンバーシップがsys.dm_tran_locksを閲覧するために必要な最低権限です。
SQL Server 2022 以降でのアクセス許可
SQL Server 2022以降のバージョンでは、sys.dm_tran_locksサーバーの許可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 つのセッションで実行されている異なるエンティティは、それぞれ同じリソースに対するロックを所有でき、request_owner_typeによって返されるrequest_owner_id列とsys.dm_tran_locks列に情報が表示されます。 同じ request_owner_type の複数のインスタンスが存在する場合は、各インスタンスを区別するために request_owner_id 列が使用されます。 分散トランザクションの場合、 request_owner_type 列と request_owner_guid 列には、さまざまなエンティティ情報が表示されます。
たとえば、セッション S1 は Table1の共有ロックを所有し、セッション S1 で実行されているトランザクション T1 は、 Table1の共有ロックも所有します。 この場合、resource_descriptionによって返されるsys.dm_tran_locks列には、同じリソースの 2 つのインスタンスが表示されます。
request_owner_type列には、1 つのインスタンスがセッションとして、もう 1 つのインスタンスがトランザクションとして表示されます。 また、 resource_owner_id 列の値も異なります。
1 つのセッションで実行する複数のカーソルは区別できないため、1 つのエンティティとして扱われます。
session_id値に関連付けられていない分散トランザクションは孤立したトランザクションであり、session_idの-2値が割り当てられます。 詳細については、「KILL (Transact-SQL)を参照してください。
Locks
ロックは、複数のトランザクションで同じ SQL Server リソースが同時に使用されるのを防ぐために、トランザクション中に読み取られたり変更されたりする行などにかけられます。 たとえば、あるトランザクションによってテーブルの行に排他 (X) ロックがかけられると、他のトランザクションはロックが解除されるまでその行を変更できません。 ロックを最小限にとどめるとコンカレンシーが向上し、パフォーマンスが向上します。
リソースの詳細
次の表に、 resource_associated_entity_id 列で表されるリソースの一覧を示します。
注
ドキュメントでは、一般的にインデックスに関して 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など)。 |
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 列の形式を示します。
Examples
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>の値は、database_idのsys.databasesに置き換える必要があります。
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