Was ist der Vorteil SET XACT_ABORT ON
einer gespeicherten Prozedur?
sql
sql-server
odiseh
quelle
quelle
Antworten:
SET XACT_ABORT ON
Weist SQL Server an, die gesamte Transaktion zurückzusetzen und den Stapel abzubrechen, wenn ein Laufzeitfehler auftritt. Es behandelt Sie in Fällen wie einem Befehlszeitlimit, das in der Clientanwendung und nicht in SQL Server selbst auftritt (was nicht durch die Standardeinstellung abgedeckt istXACT_ABORT OFF
).Da ein Abfragezeitlimit die Transaktion offen lässt,
SET XACT_ABORT ON
wird dies in allen gespeicherten Prozeduren mit expliziten Transaktionen empfohlen (sofern Sie keinen bestimmten Grund haben, etwas anderes zu tun), da die Folgen einer Anwendung, die Arbeiten an einer Verbindung mit einer offenen Transaktion ausführt, katastrophal sind.Es gibt einen wirklich guten Überblick auf Dan Guzmans Blog ,
quelle
BEGIN TRY
-BEGIN CATCH
undROLLBACK
mit demBEGIN CATCH
Block in SQL haben?BEGIN TRY
- FängtBEGIN CATCH
keine Zeitüberschreitungen in der Clientanwendung ab, und einige SQL-Fehler sind auch nicht abfangbar, sodass Sie eine offene Transaktion haben, bei der Sie keine erwarten würden.Meiner Meinung nach wurde SET XACT_ABORT ON durch das Hinzufügen von BEGIN TRY / BEGIN CATCH in SQL 2k5 überholt. Vor Ausnahmeblöcken in Transact-SQL war es wirklich schwierig, Fehler zu behandeln, und unausgeglichene Prozeduren waren allzu häufig (Prozeduren, die beim Beenden ein anderes @@ TRANCOUNT hatten als beim Eintritt).
Mit der Hinzufügung von Transact-SQL ist die Ausnahmebehandlung viel einfacher, korrekte Prozeduren zu schreiben, die garantiert einen ordnungsgemäßen Ausgleich der Transaktionen gewährleisten. Zum Beispiel verwende ich diese Vorlage für die Ausnahmebehandlung und verschachtelte Transaktionen :
Es ermöglicht mir, atomare Prozeduren zu schreiben, die bei behebbaren Fehlern nur ihre eigene Arbeit zurücksetzen.
Eines der Hauptprobleme bei Transact-SQL-Prozeduren ist die Datenreinheit : Manchmal sind die empfangenen Parameter oder die Daten in den Tabellen einfach falsch, was zu doppelten Schlüsselfehlern, referenziellen Einschränkungsfehlern, Überprüfungsbeschränkungsfehlern usw. führt. Schließlich ist dies genau die Rolle dieser Einschränkungen. Wenn diese Datenreinheitsfehler unmöglich wären und alle von der Geschäftslogik erfasst würden, wären die Einschränkungen veraltet (dramatische Übertreibung für den Effekt hinzugefügt). Wenn XACT_ABORT aktiviert ist, gehen all diese Fehler dazu, dass die gesamte Transaktion verloren geht, anstatt Ausnahmeblöcke codieren zu können, die die Ausnahme ordnungsgemäß behandeln. Ein typisches Beispiel ist der Versuch, ein INSERT durchzuführen und bei einer PK-Verletzung zu einem UPDATE zurückzukehren.
quelle
MSDN zitieren :
In der Praxis bedeutet dies, dass einige der Anweisungen möglicherweise fehlschlagen und die Transaktion "teilweise abgeschlossen" bleibt. Für einen Anrufer gibt es möglicherweise keine Anzeichen für diesen Fehler.
Ein einfaches Beispiel:
Dieser Code würde 'erfolgreich' mit XACT_ABORT OFF ausgeführt und mit einem Fehler mit XACT_ABORT ON beendet ('INSERT INTO t2' wird nicht ausgeführt und eine Clientanwendung löst eine Ausnahme aus).
Als flexibleren Ansatz können Sie nach jeder Anweisung (alte Schule) @@ ERROR überprüfen oder TRY ... CATCH-Blöcke (MSSQL2005 +) verwenden. Persönlich ziehe ich es vor, XACT_ABORT auf ON zu setzen, wenn es keinen Grund für eine erweiterte Fehlerbehandlung gibt.
quelle
In Bezug auf Client-Timeouts und die Verwendung von XACT_ABORT, um sie zu verarbeiten, gibt es meiner Meinung nach mindestens einen sehr guten Grund, Timeouts in Client-APIs wie SqlClient zu verwenden, nämlich den Client-Anwendungscode vor Deadlocks zu schützen, die im SQL Server-Code auftreten. In diesem Fall ist der Client-Code fehlerfrei, muss sich jedoch selbst davor schützen, für immer zu blockieren, bis der Befehl auf dem Server ausgeführt wird. Wenn umgekehrt Client-Timeouts zum Schutz des Client-Codes vorhanden sein müssen, muss XACT_ABORT ON den Server-Code vor Client-Abbrüchen schützen, falls die Ausführung des Server-Codes länger dauert, als der Client warten möchte.
quelle
Es wird in der Transaktionsverwaltung verwendet, um sicherzustellen, dass Fehler dazu führen, dass die Transaktion zurückgesetzt wird.
quelle