SET XACT_ABORT (Transact-SQL)

Indique si SQL Server annule automatiquement la transaction en cours lorsqu'une instruction Transact-SQL déclenche une erreur d'exécution.

Icône Lien de rubriqueConventions de syntaxe de Transact-SQL

Syntaxe

SET XACT_ABORT { ON | OFF }

Notes

Lorsque SET XACT_ABORT est défini sur ON et qu'une instruction Transact-SQL génère une erreur d'exécution, la transaction est interrompue et annulée dans son intégralité.

Si SET XACT_ABORT est défini sur OFF, dans certains cas seulement, l'instruction Transact-SQL qui a généré l'erreur est annulée et le traitement de la transaction se poursuit. Selon la gravité de l'erreur, la transaction peut être quand même annulée dans son intégralité lorsque SET XACT_ABORT est défini sur OFF. OFF est le paramètre par défaut.

Les erreurs de compilation, comme les erreurs de syntaxe, ne sont pas affectées par l'option SET XACT_ABORT.

XACT_ABORT doit être défini sur ON pour les instructions de modification des données dans une transaction implicite ou explicite avec la plupart des fournisseurs OLE DB, y compris SQL Server. Le seul cas où cette option n'est pas obligatoire, c'est lorsque le fournisseur prend en charge les transactions imbriquées. Pour plus d'informations, consultez Requêtes distribuées et transactions distribuées.

L'option SET XACT_ABORT est définie lors de l'exécution, et non pas durant l'analyse.

Exemple

L'exemple suivant provoque une erreur de violation de clé étrangère dans une transaction comportant d'autres instructions Transact-SQL. Dans le premier jeu d'instructions, l'erreur est générée mais les autres instructions sont correctement exécutées et la transaction est validée. Dans le deuxième jeu d'instructions, SET XACT_ABORT est défini sur ON. L'erreur met alors fin à l'exécution du traitement d'instructions et la transaction est annulée.

USE AdventureWorks;
GO
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