SET XACT_ABORT (Transact-SQL)

Aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Analítica (PDW)Base de datos SQL en Microsoft Fabric

Nota:

La declaración THROW honra SET XACT_ABORTa . 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 sentencia Transact-SQL genera un error en tiempo de ejecución, toda la transacción se termina y se revierte.

Cuando SET XACT_ABORT está OFF, en algunos casos solo se revierte la sentencia Transact-SQL que generó el error y la transacción continúa procesándose. Dependiendo de la gravedad del error, toda la transacción puede revertirse incluso cuando SET XACT_ABORT está 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_ABORTdebe estar activado para las sentencias de modificación de datos en una transacción implícita o explícita contra la mayoría de los proveedores de OLE DB, incluido SQL Server. El único caso donde no se requiere esta opción es si el proveedor acepta transacciones anidadas.

Cuando ANSI_WARNINGS=OFF, las violaciones de permisos hacen que las transacciones se aborten.

El valor de se establece en tiempo de SET XACT_ABORT ejecución o ejecución y 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

Consulte también