Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Aplica a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Sistema 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