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.
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.
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:
Der erste Abschnitt zeigt das Deadlockopfer und den Zeitpunkt des Deadlocks sowie die am Deadlock beteiligten Sitzungen an. Für jede Sitzung werden die aktuelle Serverprozess-ID (SPID), der Anweisungstyp und ein Teil des Eingabepuffers angezeigt.
Der zweite Abschnitt zeigt Details zu den am Deadlock beteiligten Sperren an. Beachten Sie in der oben angezeigten Ausgabe, dass Schlüsselsperren für die t1-Tabelle und den i1-Index am Deadlock beteiligt sind. Die Deadlockausgabe zeigt an, welche Prozesse die am Deadlock beteiligten Sperren besitzen und welche Sitzungen auf die Gewährung der Sperren warten sowie die zugeordneten Sperrmodi.
Der Prozess, der das geringste Protokollvolumen generiert hat, wird standardmäßig als Deadlockopfer ausgewählt, und es wird ein automatischer Rollback für ihn ausgeführt. Um zu beeinflussen, für welche Sitzung ein Rollback ausgeführt wird, legen Sie DEADLOCK_PRIORITY für eine Sitzung fest.
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 |
Target | Microsoft.SQLServer.Windows.DBEngine | ||
Category | EventCollection | ||
Enabled | True | ||
Alert Generate | True | ||
Alert Severity | Warning | ||
Alert Priority | Normal | ||
Remotable | True | ||
Alert Message |
| ||
Comment | Mom2017ID='{5DEC3ED6-3871-44AB-9D4B-2433D8BAA8A5}';MOM2017GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74} |
ID | Module Type | TypeId | RunAs |
---|---|---|---|
_F6DA1507_12AF_11D3_AB21_00A0C98620CE_ | DataSource | Microsoft.SQLServer.Windows.DataSource.EventCollectionFiltered | Default |
GenerateAlert | WriteAction | System.Health.GenerateAlert | Default |
<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>