SET XACT_ABORT (Transact-SQL)

Especifica si SQL Server revierte automáticamente la transacción actual cuando una instrucción Transact-SQL genera un error en tiempo de ejecución.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL (Transact-SQL)

Sintaxis

SET XACT_ABORT { ON | OFF }

Notas

Cuando SET XACT_ABORT es ON, si una instrucción Transact-SQL genera un error en tiempo de ejecución, se finaliza y revierte toda la transacción.

Cuando SET XACT_ABORT es OFF, en algunos casos sólo se revierte la instrucción Transact-SQL que generó el error y la transacción continúa procesándose. Dependiendo de la gravedad del error, se puede revertir toda la transacción aun cuando SET XACT_ABORT sea OFF. OFF es el valor predeterminado.

Los errores de compilación, como los de sintaxis, no se ven afectados por SET XACT_ABORT.

XACT_ABORT debe estar establecida en ON para las instrucciones de modificación de datos en una transacción implícita o explícita para la mayoría de proveedores OLE DB, incluyendo SQL Server. El único caso donde no se requiere esta opción es si el proveedor acepta transacciones anidadas. Para obtener más información, vea Consultas distribuidas y transacciones distribuidas.

La opción SET XACT_ABORT se establece en tiempo de ejecución, no en tiempo de análisis.

Ejemplos

El siguiente código de ejemplo genera un error de infracción de clave externa en una transacción que tiene otras instrucciones Transact-SQL. En el primer conjunto de instrucciones se genera el error, pero las demás instrucciones se ejecutan correctamente y la transacción se confirma también correctamente. En el segundo conjunto de instrucciones, SET XACT_ABORT se establece en ON. Esto hace que el error en la instrucción suspenda el lote y revierta la transacción.

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