適用対象:SQL Server
Azure SQL Managed Instance
SQL Server プロファイラー を使用して、デッドロックの原因を特定します。 SQL Server 内の一部のリソース セットに対して、複数のスレッドまたはプロセスの間に循環依存関係がある場合、デッドロックが発生します。 SQL Server プロファイラーを使用すると、分析用にデッドロック イベントを記録、再生、および表示するトレースを作成できます。
デッドロック イベントをトレースするには、 Deadlock Graph イベント クラスをトレースに追加します。 このイベント クラスにより、デッドロックに関連するプロセスとオブジェクトに関する XML データが、トレースの TextData データ列に設定されます。 SQL Server プロファイラー では、この XML ドキュメントをデッドロック XML (.xdl) ファイルに抽出して、後で SQL Server Management Studio で表示できます。 SQL Server プロファイラー Deadlock Graph イベントを、すべての Deadlock Graph イベントが含まれた 1 つのファイルに抽出するか、または個別のファイルに抽出するように を構成できます。 この抽出は、次の方法のいずれかを使用して実行できます。
トレース構成時に、[イベント抽出設定] タブを使用します。このタブは、[イベントの選択] タブでデッドロック グラフ イベントを選択するまで表示されません。
[ファイル] メニューの [SQL Server イベントの抽出] オプションを使用する。
特定のイベントを右クリックし、 [イベント データの抽出] をクリックすることにより、個々のイベントを抽出して保存することもできます。
デッドロック グラフ
SQL Server プロファイラー と SQL Server Management Studio では、Deadlock Wait-for Graph を使用してデッドロックが説明されます。 Deadlock Wait-for Graph には、プロセス ノード、リソース ノード、およびプロセスとリソース間の関係を表すエッジが含まれています。 次の表では、待ちグラフの構成要素を定義します。
ノード | 説明 |
---|---|
プロセス ノード | タスクを実行するスレッド。たとえば、 INSERT 、 UPDATE 、 DELETE などです。 |
リソース ノード | テーブル、インデックス、行などのデータベース オブジェクト。 |
エッジ | プロセスとリソース間の関係。 request エッジは、プロセスがリソースを待機したときに発生します。 owner エッジは、リソースがプロセスを待機したときに発生します。 ロック モードは、エッジの記述に含まれます。 たとえば、モード:X などです。 |
デッドロック プロセス ノード
待ちグラフでは、プロセスノードにプロセスに関する情報が含まれています。 次の表で、プロセスの構成要素について説明します。
コンポーネント | 定義 |
---|---|
サーバー プロセス ID | セッション ID (SPID)、ロックを所有しているプロセスのサーバー割り当て識別子。 |
サーバー バッチ ID | サーバー バッチ ID (SBID)。 |
実行コンテキスト ID | 実行コンテキスト ID (ECID)。 特定のセッション ID に関連付けられている特定のスレッドの実行コンテキスト ID。 ECID = { 0, 1, 2, 3, ...n }。ここで、0 は常にメインスレッドまたは親スレッドを表し、{1、2、3、 ...n } はサブスレッドを表します。 |
[デッドロックの優先度] | プロセスのデッドロックの優先度。 使用可能な値の詳細については、「 SET DEADLOCK_PRIORITY」を参照してください。 |
[使用されたログ] | プロセスで使用されたログ領域の量。 |
[所有者 ID] | トランザクションを使用しており、現在ロックを待機しているプロセスのトランザクション ID。 |
[トランザクション記述子] | トランザクションの状態を記述するトランザクション記述子へのポインター。 |
[入力バッファー] | 現在のプロセスの入力バッファー。イベントの種類と実行中のステートメントを定義します。 指定できる値は、次のとおりです。 言語 RPC なし |
ステートメント | ステートメントの種類。 次のいずれかの値になります。 NOP 選択 更新 挿入する 削除 不明 |
デッドロック リソース ノード
デッドロックにおいて、2 つのプロセスが、他のプロセスで使用されているリソースをそれぞれ待機しています。 Deadlock Graph では、これらのリソースがリソース ノードとして表示されます。