MSSQL unter Windows: Die Transaktion befand sich wegen eines anderen Prozesses in einer ressourcenbezogenen Deadlocksituation und wurde als Deadlockopfer ausgewählt. Führen Sie die Transaktion erneut aus.

Microsoft.SQLServer.Windows.EventRule.DBEngine.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule (Rule)

Dieser Fehler tritt auf, wenn in Microsoft® SQL Server™ ein Deadlock auftritt. Ein Deadlock tritt auf, wenn zwei (oder mehr) Prozesse auf eine Ressource zuzugreifen versuchen, die ein anderer Prozess gesperrt hat. Da jeder Prozess eine Anforderung für eine andere Ressource aufweist, kann keiner der Prozesse abgeschlossen werden. Wenn ein Deadlock erkannt wird, führt SQL Server einen Rollback des Befehls mit der kürzesten Verarbeitungsdauer aus und gibt die Fehlermeldung 1205 an die Clientanwendung zurück. Dieser Fehler ist nicht schwerwiegend und führt nicht unbedingt zum Beenden des Batchs.

Knowledge Base article:

Zusammenfassung

Dieser Fehler tritt auf, wenn in Microsoft® SQL Server™ ein Deadlock auftritt. Ein Deadlock tritt auf, wenn zwei (oder mehr) Prozesse auf eine Ressource zuzugreifen versuchen, die ein anderer Prozess gesperrt hat. Da jeder Prozess eine Anforderung für eine andere Ressource aufweist, kann keiner der Prozesse abgeschlossen werden. Wenn ein Deadlock erkannt wird, führt SQL Server einen Rollback des Befehls mit der kürzesten Verarbeitungsdauer aus und gibt die Fehlermeldung 1205 an die Clientanwendung zurück. Dieser Fehler ist nicht schwerwiegend und führt nicht unbedingt zum Beenden des Batchs.

Lösungen

In einigen Fällen führt eine Deadlock-Bedingung dazu, dass eine DB-Bibliotheksfunktion (wie dbsqlexec, dbsqlok, dbresults oder dbnextrow ) einen FEHLER ausgibt. Die Prüfung der Rückgabecodes aus DB-Bibliotheksfunktionen ist immer Aufgabe des Programms. Wenn von einer der DB-Bibliotheksfunktionen ein FEHLER ausgegeben wird, soll das Programm den Batch abbrechen und nicht versuchen, den Vorgang fortzusetzen. In einigen Fällen ist es möglich, folgeende Funktionen im Batch weiter auszuführen. Wenn jedoch eine Deadlock-Situation aufgetreten ist und die Funktionen, die diese herbeigeführt haben, zurückgesetzt wurden, schlagen spätere Funktionen in dem Batch wahrscheinlich mit einer schwerwiegenderen Fehlermeldung wie "Objekt nicht gefunden" fehl.

In anderen Fällen führt ein Deadlockzustand nicht dazu, dass eine DB-Library-Funktion FAIL zurückgibt. In diesen Fällen muss das Programm den Nachrichtenhandler auf die Fehlermeldung 1205 überprüfen und die dbsetuserdata-Funktion verwenden, um dies der Anwendung mitzuteilen. Anschließend muss das Programm nach jedem DB-Library-Aufruf den Deadlockindikator überprüfen. Der Batch sollte abgebrochen werden, wenn ein Deadlock erkannt wird.

Obwohl es möglicherweise unnötig scheinen mag, nach Empfang einer Deadlockmeldung 1205 einen Batch abzubrechen, ist dies notwendig, da der Server den Batch in einer Deadlocksituation nicht immer beendet. Wenn der Batch nicht abgebrochen wird, können alle Versuche, einen neuen Batch abzusenden, zum DB-Library-Fehler 10038 "Es wurde versucht, einen neuen SQL Server-Vorgang zu starten, obwohl Ergebnisse ausstehen" führen.

Sie können auch die SET DEADLOCK_PRIORITY-Anweisung (mit dem Parameter LOW oder NORMAL) verwenden. Von SET DEADLOCK_PRIORITY wird die Reaktion der Sitzung in einer Deadlocksituation gesteuert. Wenn LOW festgelegt ist, ist der Prozess das bevorzugte Opfer einer Deadlocksituation. Wenn NORMAL festgelegt ist, wird von der Sitzung die Standardbehandlungsmethode für Deadlocks verwendet.

Beim Fortbestehen einer Deadlocksituation ist es oft hilfreich, das Ablaufverfolgungsflag 1204 zu verwenden, um weitere Informationen zu sammeln. Das Ablaufverfolgungsflag 1204 druckt die Deadlockketten und das Deadlockopfer, wie in dieser Beispielausgabe gezeigt, aus:

*** Deadlock Detected *** == Process 7 chosen as deadlock victim == Deadlock Detected at: 1998-09-10 16:39:29.17 == Session participant information: SPID: 7 ECID: 0 Statement Type: UPDATE Input Buf: update t1 set c1 = c1 where c1 = 2 SPID: 8 ECID: 0 Statement Type: UPDATE Input Buf: update t1 set c1 = c1 where c1 = 1 == Deadlock Lock participant information: == Lock: KEY: 2:117575457:1 (010001000000) Database: tempdb Table: t1 Index: i1 - Held by: SPID 7 ECID 0 Mode "S" - Requested by: SPID 8 ECID 0 Mode "X" == Lock: KEY: 2:117575457:1 (020002000000) Database: tempdb Table: t1 Index: i1 - Held by: SPID 8 ECID 0 Mode "S" - Requested by: SPID 7 ECID 0 Mode "X"

Diese Deadlockinformationen können wie folgt interpretiert werden:

Überschreibbare Parameter

Name

Beschreibung

Standardwert

Aktiviert

Aktiviert oder deaktiviert den Workflow.

Ja

Intervall (Sekunden)

Gibt das Wiederholungsintervall in Sekunden für die Ausführung des Workflows an.

300

Priorität

Definiert die Warnungspriorität.

1

Schweregrad

Definiert den Warnungsschweregrad.

1

Synchronisierungszeit

Synchronisierungszeit

 

Timeout (Sekunden)

Gibt die Zeit an, zu der der Workflow ausgeführt werden dann, bevor er geschlossen und als fehlerhaft markiert wird.

200

Timeout für Datenbankverbindung (Sekunden)

Es tritt ein Fehler beim Workflow auf, und ein Ereignis wird registriert, wenn der Workflow nicht innerhalb des angegebenen Zeitraums auf die Datenbank zugreifen kann.

15

Element properties:

TargetMicrosoft.SQLServer.Windows.DBEngine
CategoryEventCollection
EnabledTrue
Alert GenerateTrue
Alert SeverityWarning
Alert PriorityNormal
RemotableTrue
Alert Message
MSSQL unter Windows: Die Transaktion befand sich wegen eines anderen Prozesses in einer ressourcenbezogenen Deadlocksituation und wurde als Deadlockopfer ausgewählt. Führen Sie die Transaktion erneut aus.
{0}
CommentMom2017ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2017GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}

Member Modules:

ID Module Type TypeId RunAs 
_F6DA1507_12AF_11D3_AB21_00A0C98620CE_ DataSource Microsoft.SQLServer.Windows.DataSource.EventCollectionFiltered Default
GenerateAlert WriteAction System.Health.GenerateAlert Default

Source Code:

<Rule ID="Microsoft.SQLServer.Windows.EventRule.DBEngine.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule" Target="SqlDiscW!Microsoft.SQLServer.Windows.DBEngine" Enabled="true" ConfirmDelivery="true" Remotable="true" Comment="Mom2017ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2017GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}">
<Category>EventCollection</Category>
<DataSources>
<DataSource ID="_F6DA1507_12AF_11D3_AB21_00A0C98620CE_" Comment="{F6DA1507-12AF-11D3-AB21-00A0C98620CE}" TypeID="Microsoft.SQLServer.Windows.DataSource.EventCollectionFiltered">
<MachineName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/MachineName$</MachineName>
<NetbiosComputerName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/NetbiosComputerName$</NetbiosComputerName>
<InstanceName>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/InstanceName$</InstanceName>
<ConnectionString>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/ConnectionString$</ConnectionString>
<InstanceVersion>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/Version$</InstanceVersion>
<InstanceEdition>$Target/Property[Type="SqlCoreLib!Microsoft.SQLServer.Core.DBEngine"]/Edition$</InstanceEdition>
<MonitoringType>$Target/Property[Type="SqlDiscW!Microsoft.SQLServer.Windows.DBEngine"]/MonitoringType$</MonitoringType>
<SqlTimeoutSeconds>15</SqlTimeoutSeconds>
<TimeoutSeconds>200</TimeoutSeconds>
<IntervalSeconds>300</IntervalSeconds>
<SyncTime/>
<EventDisplayNumber>1205</EventDisplayNumber>
</DataSource>
</DataSources>
<WriteActions>
<WriteAction ID="GenerateAlert" TypeID="Health!System.Health.GenerateAlert">
<Priority>1</Priority>
<Severity>1</Severity>
<AlertMessageId>$MPElement[Name="Microsoft.SQLServer.Windows.EventRule.DBEngine.Transaction_was_deadlocked_on_resources_with_another_process_and_has_been_chosen_as_the_deadlock_victim._Rerun_the_transaction_1_5_Rule.AlertMessage"]$</AlertMessageId>
<AlertParameters>
<AlertParameter1>Event ID: $Data/Property[@Name='EventID']$. $Data/Property[@Name='Message']$</AlertParameter1>
</AlertParameters>
<Suppression>
<SuppressionValue/>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>