SET XACT_ABORT (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Nota:
La instrucción THROW respeta SET XACT_ABORT. RAISERROR no lo hace. Las nuevas aplicaciones deben usar THROW en vez de RAISERROR.
Esta opción 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.
Convenciones de sintaxis de Transact-SQL
Sintaxis
SET XACT_ABORT { ON | OFF }
Comentarios
Cuando SET XACT_ABORT está activado, si una instrucción de Transact-SQL genera un error en tiempo de ejecución, se termina toda la transacción y se revierte.
Cuando SET XACT_ABORT está desactivado, en algunos casos solo se revierte la instrucción de 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 en una instrucción T-SQL, mientras que ON es el de un desencadenador.
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.
Cuando ANSI_WARNINGS=OFF, las infracciones de los permisos hacen que se anulen las transacciones.
La opción SET XACT_ABORT se establece en tiempo de ejecución, no en tiempo de análisis.
Para ver la configuración actual de este valor, ejecute la consulta siguiente.
DECLARE @XACT_ABORT VARCHAR(3) = 'OFF';
IF ( (16384 & @@OPTIONS) = 16384 ) SET @XACT_ABORT = 'ON';
SELECT @XACT_ABORT AS XACT_ABORT;
Ejemplos
El siguiente código de ejemplo genera un error de infracción de clave externa en una transacción que tiene otras instrucciones de 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.
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