> ## 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.

# Database deadlocks

> Log and analyze SQL database deadlocks in ABBYY FlexiCapture using Extended Events sessions, with sample queries for XEvents and the system_health session.

If SQL database deadlocks occur while you are using the program, enable deadlock information logging using the Extended Events system.

## Create an XEvents session

Create the session with the SQL Server Management Studio wizard:

1. Launch the New Session Wizard from Object Explorer under **Management → Extended Events → Sessions**.

   <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="Screenshot of SQL Server Management Studio launching the New Session Wizard from Object Explorer under Management, Extended Events, Sessions." width="278" height="300" data-path="images/flexi-capture/TG_Communication_DeadLock_1.png" />
   </Frame>
2. Specify a name for your session. To launch it on server start, select the **Start the event session at server startup** option.

   <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="Screenshot of the New Session Wizard with a session name entered and the Start the event session at server startup option selected." width="716" height="333" data-path="images/flexi-capture/TG_Communication_DeadLock_2.png" />
   </Frame>
3. In the **Select Events To Capture** section, look for `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="Screenshot of the Select Events To Capture step of the New Session Wizard with xml_deadlock_report selected." width="866" height="572" data-path="images/flexi-capture/TG_Communication_DeadLock_3.png" />
   </Frame>
4. In the **Specify Session Data Storage** section, specify the path to the location where the file containing the recorded session results is stored. The **Enable file rollover** option enables automatic rotation in the specified directory.
5. In the **Summary** section, you can open and save the wizard session results in T-SQL.

## View deadlock information

### From the XEvents session

To read `.xel` files, SQL Server provides the `sys.fn_xe_file_target_read_file` table-valued function. Run the following query in SQL Server Management Studio, specifying the path to the trace files:

```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  -- wildcard (deadlocks*.xel)
cross apply (select cast(f.event_data as xml)) as e(xdata);
```

### From the system\_health session

If deadlock logging is not enabled, you can view deadlock information using the `system_health` session, which is always enabled by default. Run the following query in 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';
```

### In Azure

Azure has a separate session that is collected in blob storage by default. To view it, run the query below in the master context:

```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);
```

After you run the query, contact technical support and provide the deadlock information from the results.
