Deadlock-Fehler mit Microsoft SQL Server

Produkt

B2B by Practice oder andere Services, die eine MSSQL Datenbank verwenden

Symptom

Bei paralleler Verarbeitung von mehreren Nachrichten kommt es zu Datenbankfehler:

com.microsoft.sqlserver.jdbc.SQLServerException: Transaction (Process ID 62) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Fehler

Fehlerhafte Konfiguration der Datenbank-Einstellungen “READ COMMITTED SNAPSHOT”, “max degree of parallelism” und “cost threshold for parallelism”. Wobei READ COMMITTED SNAPSHOT die entscheidenste Eigenschaft ist.

Lösung

Einstellungen für die Parallelisierung überprüfen und anpassen Added: Microsoft Empfehlung hierzu siehe: https://docs.microsoft.com/de-de/sql/database-engine/configure-windows/configure-the-max-degree-of-parallelism-server-configuration-option?view=sql-server-ver15#guidelines

READ_COMMITTED_SNAPSHOT

Umsetzung

READ_COMMITTED_SNAPSHOT

Überprüfen, ob die Einstellung auf ON (1) steht.

SELECT is_read_committed_snapshot_on 
FROM sys.databases 
WHERE name = 'MyDatabase';

Bei Bedarf die Einstellung auf ON setzen:

ALTER DATABASE MyDatabase  
SET READ_COMMITTED_SNAPSHOT ON

“max degree of parallelism” und “cost threshold for parallelism”

Die Einstellungen überprüfen mit sp_configure

Einstellungen von DB Administratoren anpassen lassen. Mit diesen Werten gab es den Fehler nicht mehr:

max degree of parallelism = 3
cost threshold for parallelism = 25

Interne Referenz: ZEP-30299, BTOB-13001