Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel
Gilt für: SQL Server
Azure SQL-Datenbank
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Hinweis
SET XACT_ABORT wird von der THROW-Anweisung berücksichtigt. RAISERROR wird nicht berücksichtigt. In neuen Anwendungen sollte THROW statt RAISERROR verwendet werden.
Gibt an, ob SQL Server die aktuelle Transaktion automatisch zurücksetzt, wenn eine Transact-SQL-Anweisung einen Laufzeitfehler auslöst.
Transact-SQL-Syntaxkonventionen
SET XACT_ABORT { ON | OFF }
Wenn SET XACT_ABORT eingeschaltet ist und eine Transact-SQL-Anweisung einen Laufzeitfehler auslöst, wird die gesamte Transaktion beendet und zurückgerollt.
Wenn SET XACT_ABORT ausgeschaltet ist, wird in einigen Fällen nur die Transact-SQL-Anweisung, die den Fehler ausgelöst hat, zurückgesetzt und die Transaktion wird fortgesetzt. Abhängig vom Schweregrad des Fehlers wird möglicherweise für die gesamte Transaktion ein Rollback ausgeführt, wenn SET XACT_ABORT auf OFF festgelegt ist. OFF ist die Standardeinstellung in einer T-SQL-Anweisung, während ON die Standardeinstellung in einem Trigger ist.
Kompilierungsfehler, wie z. B. Syntaxfehler, sind von SET XACT_ABORT nicht betroffen.
XACT_ABORT muss für Datenänderungsanweisungen in einer impliziten oder expliziten Transaktion gegen die meisten OLE DB-Anbieter, einschließlich SQL Server, auf ON gesetzt werden. Nur wenn der Anbieter geschachtelte Transaktionen unterstützt, ist diese Option nicht erforderlich.
Bei ANSI_WARNINGS=OFF werden Transaktionen aufgrund von Berechtigungsverletzungen abgebrochen.
Die Einstellung von SET XACT_ABORT wird zur Ausführungszeit und nicht zur Analysezeit festgelegt.
Um die aktuelle Einstellung anzuzeigen, führen Sie die folgende Abfrage aus.
DECLARE @XACT_ABORT VARCHAR(3) = 'OFF';
IF ( (16384 & @@OPTIONS) = 16384 ) SET @XACT_ABORT = 'ON';
SELECT @XACT_ABORT AS XACT_ABORT;
Das folgende Codebeispiel verursacht einen Fremdschlüsselverletzungsfehler in einer Transaktion, die andere Transact-SQL-Anweisungen enthält. In der ersten Anweisungsgruppe wird der Fehler generiert; die anderen Anweisungen werden jedoch erfolgreich ausgeführt, und für die Transaktion wird erfolgreich ein Commit ausgeführt. Im zweiten Anweisungssatz ist SET XACT_ABORT
auf ON
festgelegt. Der Anweisungsfehler bewirkt daher, dass der Batch abgebrochen und für die Transaktion ein Rollback ausgeführt wird.
IF OBJECT_ID(N't2', N'U') IS NOT NULL
DROP TABLE t2;
GO
IF OBJECT_ID(N't1', N'U') IS NOT NULL
DROP TABLE t1;
GO
CREATE TABLE t1
(a INT NOT NULL PRIMARY KEY);
CREATE TABLE t2
(a INT NOT NULL REFERENCES t1(a));
GO
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (6);
GO
SET XACT_ABORT OFF;
GO
BEGIN TRANSACTION;
INSERT INTO t2 VALUES (1);
INSERT INTO t2 VALUES (2); -- Foreign key error.
INSERT INTO t2 VALUES (3);
COMMIT TRANSACTION;
GO
SET XACT_ABORT ON;
GO
BEGIN TRANSACTION;
INSERT INTO t2 VALUES (4);
INSERT INTO t2 VALUES (5); -- Foreign key error.
INSERT INTO t2 VALUES (6);
COMMIT TRANSACTION;
GO
-- SELECT shows only keys 1 and 3 added.
-- Key 2 insert failed and was rolled back, but
-- XACT_ABORT was OFF and rest of transaction
-- succeeded.
-- Key 5 insert error with XACT_ABORT ON caused
-- all of the second transaction to roll back.
SELECT *
FROM t2;
GO