Monitoring SQL Database Deadlocks
You can set up the system to log deadlocks that occur in the SQL database. The deadlocks are recorded in the Windows Event Log of computer running Business Central Server. The log entries provide information about the AL code that was run when the deadlock occurred, along with the deadlock report from SQL Server. This information can help you identify and resolve problem areas in the application design.
Deadlocks can prevent users from completing tasks in the Business Central client. A deadlock occurs when two or more processes or transactions block each other from continuing because each has locked a database resource that the other transaction needs. SQL Server handles deadlocks by terminating and rolling back transactions that were started after the first transaction.
For general information about deadlocks, see Detecting and Ending Deadlocks.
Setting Up Deadlock Logging
Setting up deadlock logging requires you to configure the SQL Server instance and the Business Central Server instance.
Note: If you installed the Business Central Server and database components by using the Install Demo option in the Business Central Setup, then deadlock logging is set up by default.
Configure the SQL Server instance
To configure the SQL Server instance to log deadlocks, you must assign specific permissions to the database login for the service account that is used on the Business Central Server instance. You can do this using SQL Server Management Studio.
In SQL Server Management Studio, connect to the SQL server instance for Business Central, and then grant the following permissions:
- On the database level, grant the login the View database state permission.
- On the SQL server instance level, grant the login both Alter any event session and View server state permissions.
For detailed steps on how to do this, see Giving the account necessary database privileges in SQL Server.
The next time a client session is established with the database, a session for monitoring the Business Central database appears under Management, Extended Events.
Configure where to store deadlock events
By default, SQL Server uses an in-memory data structure called a ring_buffer target to store deadlock events. When the Business Central Server is notified about the deadlock, it reads data from the target ring_buffer target. You have the option to also store the events to a file on the SQL Server, called an event_file target, and configure the Business Central Server to read from this file instead of the ring_buffer target. An important difference between the ring_buffer target and event_file target is that the ring_buffer target has a storage size limitation of 5MB, while the event_file target provides a much greater storage capacity. Using the event_file target can eliminate potential overloads in high volume situations. So, if your setup has a high volume of database traffic, you might have to change the SQL Server to write deadlock events to an event_file target as described the steps that follow. If you want to use the default ring_buffer target, then no further action is required.
Reading from the event_file target is only supported in Business Central Cumulative Update 3 and later.
Modify the deadlock monitoring session to use a file-based target (known as an event_file target).
The event_file target writes event session output from a buffer to a disk file that you specify. There are two ways to do this:
- From Object Explorer, open the session's Properties, and then on the Data Storage page, add an event_file type target.
- Using a query, run the ALTER EVENT SESSION transact-sql statement. For example:
ALTER EVENT SESSION [Demo Database BC_deadlock_monitor] ON SERVER ADD Target package0.event_file ( SET filename=N'C:\logging\mydeadlocks.xel',max_file_size=(10240) )
C:\logging\mydeadlocks.xelwith the path and file name that you want to store the data.
In the Business Central database, create a view that has the nameFor example:
deadlock_report_event_file_viewand uses the new event_file target.
USE [Demo Database BC] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE VIEW deadlock_report_event_file_view AS SELECT event_data AS event_raw_data FROM sys.fn_xe_file_target_read_file ('C:\logging\*.xel', null, null, null) GO
C:\logging\with the path to the event file.
You can delete the ring_buffer target if you like. However, this is not required.
Configure the Business Central Server instance
To log deadlocks, you must enable deadlock logging on the Business Central Server instance. You can enable deadlock logging by using the Business Central Server Administration tool or the Set-NAVServerConfiguration cmdlet in the Business Central Administration Shell.
To enable deadlock logging by using the Business Central Server Administration tool, open the server instance for editing, and then select the Enable Deadlock Monitoring check box in the Database section.
For more information about how to use the Business Central Server Administration tool, see Business Central Server Administration Tool.
To enable logging by using the Set-NAVServerConfiguration cmdlet, include the keyname EnableDeadlockMonitoring keyvalue true parameters in the command, such as:
Set-NAVServerConfiguration -ServerInstance MyServerInstance -KeyName EnableDeadlockMonitoring -KeyValue true
Viewing Deadlocks in the Windows Event Log
Similar to other errors and events in Business Central, you can monitor deadlocks by using Event Viewer on the computer running Business Central Server. Deadlocks are recorded as warnings in the Business Central Server Admin channel log in the Applications and Services Logs. For general information about how to view the Business Central Server logs, see Monitor Business Central Server Events Using Event Viewer.
Deadlock Event Overview
Deadlock event log entries have the event ID 705 and task category 33 (TelemetryData). The following table describes some of important information that is included in deadlock log entry:
|serverInstanceName||Specifies the Business Central Server instance on which the event occurred.|
|user||Specifies the Business Central user account that ran the transaction that caused the event.|
|AL ObjectType||Specifies the Business Central object in AL that ran the transaction, such as a page or report.|
|AL ObjectNumber||Specifies the ID of the object that was run.|
|AL ScopeName||Specifies the AL function that ran the transaction that caused the event.|
|SQL Server deadlock XML report||Includes the deadlock report that was recieved from SQL Server. For more information, see Analyze Deadlocks.|
Note: The system cannot record information about AL code that was executed on a different Business Central Server. Therefore, the three attributes AL ObjectType, AL ObjectNumber and AL ScopeName might be empty in a given event log entry.
View a graphical representation of the deadlock event
To view a graphical representation of the deadlock, perform the following steps:
- Open the deadlock event in Event Viewer.
- On the General tab, go to the SQL Server deadlock xml report section, and then copy the text in the deadlock tag (including the start and end tag) to a text editor such as Notepad or Visual Studio Code.
- Save the file as a .xdl type.
- Open the file in SQL Server Management Studio.
Filter on deadlock events
All deadlock events have the trace tag 00000DI. If you only want to see deadlocks events in the log, you can use this tag in an XML path filter on the log, as shown in the following example:
<QueryList> <Query Id="0" Path="Microsoft-Dynamics365BusinessCentral-Server/Admin"> <Select Path="Microsoft-Dynamics365BusinessCentral-Server/Admin"> *[EventData[Data[@Name='tag'] and (Data='00000DI')]] </Select> </Query> </QueryList>
For more information about XML filtering, see Advanced XML filtering in the Windows Event Viewer.