> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# データベースのデッドロック

> Extended Events セッションを使用して ABBYY FlexiCapture の SQL データベース デッドロックをログに記録して分析する方法を、XEvents および system_health セッションのサンプル クエリとともに説明します。

プログラムの使用中に SQL データベースのデッドロックが発生する場合は、Extended Events システムを使用してデッドロック情報のログ記録を有効にしてください。

<div id="create-an-xevents-session">
  ## XEvents セッションを作成する
</div>

SQL Server Management Studio のウィザードを使用してセッションを作成します。

1. **Management → Extended Events → Sessions** 配下の Object Explorer から New Session Wizard を起動します。

   <Frame>
     <img src="https://mintcdn.com/abbyy/XVEmG3cTpHwMKf5X/images/flexi-capture/TG_Communication_DeadLock_1.png?fit=max&auto=format&n=XVEmG3cTpHwMKf5X&q=85&s=34da823659fa5d183236dffad4ea93dd" alt="Management、Extended Events、Sessions 配下の Object Explorer から New Session Wizard を起動している SQL Server Management Studio のスクリーンショット。" width="278" height="300" data-path="images/flexi-capture/TG_Communication_DeadLock_1.png" />
   </Frame>
2. セッション名を指定します。サーバーの起動時に開始するには、**Start the event session at server startup** オプションを選択します。

   <Frame>
     <img src="https://mintcdn.com/abbyy/XVEmG3cTpHwMKf5X/images/flexi-capture/TG_Communication_DeadLock_2.png?fit=max&auto=format&n=XVEmG3cTpHwMKf5X&q=85&s=ec0de39e0fb9b653601f9dd895a6663c" alt="セッション名が入力され、Start the event session at server startup オプションが選択された New Session Wizard のスクリーンショット。" width="716" height="333" data-path="images/flexi-capture/TG_Communication_DeadLock_2.png" />
   </Frame>
3. **Select Events To Capture** セクションで、`xml_deadlock_report` を探します。

   <Frame>
     <img src="https://mintcdn.com/abbyy/XVEmG3cTpHwMKf5X/images/flexi-capture/TG_Communication_DeadLock_3.png?fit=max&auto=format&n=XVEmG3cTpHwMKf5X&q=85&s=fcc170b0d35e0d921820aa56989df4f8" alt="xml_deadlock_report が選択された New Session Wizard の Select Events To Capture ステップのスクリーンショット。" width="866" height="572" data-path="images/flexi-capture/TG_Communication_DeadLock_3.png" />
   </Frame>
4. **Specify Session Data Storage** セクションで、記録されたセッション結果を含むファイルの保存先パスを指定します。**Enable file rollover** オプションを有効にすると、指定したディレクトリ内でファイルが自動的にローテーションされます。
5. **Summary** セクションでは、ウィザードのセッション結果を T-SQL として開いて保存できます。

<div id="view-deadlock-information">
  ## デッドロック情報を確認する
</div>

<div id="from-the-xevents-session">
  ### XEvents セッションから
</div>

`.xel` ファイルを読み取るには、SQL Server が提供するテーブル値関数 `sys.fn_xe_file_target_read_file` を使用します。トレース ファイルのパスを指定して、SQL Server Management Studio で次のクエリを実行します。

```sql theme={null}
select
    xdata.value('(/event/data/value/deadlock/process-list/process/@lasttranstarted)[1]', 'datetime')   as lasttranstarted,
    xdata.value('(/event/data/value/deadlock/resource-list/keylock/@objectname)[1]', 'nvarchar(max)')  as objectname,
    xdata.value('(/event/data/value/deadlock/process-list/process/@clientapp)[1]', 'nvarchar(256)')    as client_app,
    xdata.value('(/event/data/value/deadlock/process-list/process/@hostname)[1]', 'nvarchar(256)')     as hostname,
    xdata.value('(/event/data/value/deadlock/process-list/process/@loginname)[1]', 'nvarchar(256)')    as loginname,
    xdata.value('(/event/data/value/deadlock/resource-list/keylock/@indexname)[1]', 'nvarchar(256)')   as indexname,
    xdata.value('(/event/data/value/deadlock/process-list/process/@waittime)[1]', 'int')               as waittime,
    xdata.value('(/event/data/value/deadlock/resource-list/keylock/@mode)[1]', 'nvarchar(10)')         as lockmode,
    xdata.query('(/event/data/value/deadlock)[1]')                                                     as deadlock_graph
from sys.fn_xe_file_target_read_file('D:\MSSQL\XE\deadlocks\deadlocks*.xel', null, null, null) as f  -- ワイルドカード (deadlocks*.xel)
cross apply (select cast(f.event_data as xml)) as e(xdata);
```

<div id="from-the-system_health-session">
  ### `system_health` セッションから
</div>

デッドロックのログ記録が有効になっていない場合は、既定で常に有効になっている `system_health` セッションを使用して、デッドロック情報を確認できます。SQL Server Management Studio で次のクエリを実行します。

```sql theme={null}
select
    e.xdata.value('(/event/data/value/deadlock/process-list/process/@lasttranstarted)[1]', 'datetime')   as lasttranstarted,
    e.xdata.value('(/event/data/value/deadlock/resource-list/keylock/@objectname)[1]', 'nvarchar(max)')  as objectname,
    e.xdata.value('(/event/data/value/deadlock/process-list/process/@clientapp)[1]', 'nvarchar(256)')    as client_app,
    e.xdata.value('(/event/data/value/deadlock/process-list/process/@hostname)[1]', 'nvarchar(256)')     as hostname,
    e.xdata.value('(/event/data/value/deadlock/process-list/process/@loginname)[1]', 'nvarchar(256)')    as loginname,
    e.xdata.value('(/event/data/value/deadlock/resource-list/keylock/@indexname)[1]', 'nvarchar(256)')   as indexname,
    e.xdata.value('(/event/data/value/deadlock/process-list/process/@waittime)[1]', 'int')               as waittime,
    e.xdata.value('(/event/data/value/deadlock/resource-list/keylock/@mode)[1]', 'nvarchar(10)')         as lockmode,
    e.xdata.query('(/event/data/value/deadlock)[1]')                                                     as deadlock_graph
from sys.fn_xe_file_target_read_file('system_health*.xel', null, null, null) as f
cross apply (select cast(f.event_data as xml)) as e(xdata)
where object_name = N'xml_deadlock_report';
```

<div id="in-azure">
  ### Azure の場合
</div>

Azure では、既定で Blob ストレージに収集される別個のセッションがあります。これを表示するには、マスター コンテキストで以下のクエリを実行します。

```sql theme={null}
select
    f.file_name,
    xdata.value('(/event/data/value/deadlock/process-list/process/@lasttranstarted)[1]', 'datetime')   as lasttranstarted,
    xdata.value('(/event/data/value/deadlock/resource-list/keylock/@objectname)[1]', 'nvarchar(max)')  as objectname,
    xdata.value('(/event/data/value/deadlock/process-list/process/@clientapp)[1]', 'nvarchar(256)')    as client_app,
    xdata.value('(/event/data/value/deadlock/process-list/process/@hostname)[1]', 'nvarchar(256)')     as hostname,
    xdata.value('(/event/data/value/deadlock/process-list/process/@loginname)[1]', 'nvarchar(256)')    as loginname,
    xdata.value('(/event/data/value/deadlock/resource-list/keylock/@indexname)[1]', 'nvarchar(256)')   as indexname,
    xdata.value('(/event/data/value/deadlock/process-list/process/@waittime)[1]', 'int')               as waittime,
    xdata.value('(/event/data/value/deadlock/resource-list/keylock/@mode)[1]', 'nvarchar(10)')         as lockmode,
    xdata.query('(/event/data/value/deadlock)[1]')                                                     as deadlock_graph
from sys.fn_xe_telemetry_blob_target_read_file('dl', null, null, null) as f
cross apply (select cast(f.event_data as xml)) as e(xdata);
```

クエリを実行したら、テクニカルサポートに連絡し、結果に表示されたデッドロック情報を提供してください。
