SET XACT_ABORT (Transact-SQL)SET XACT_ABORT (Transact-SQL)

SE APLICA A: síSQL Server síAzure SQL Database síAzure Synapse Analytics (SQL DW) síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Nota

La instrucción THROW respeta SET XACT_ABORT.The THROW statement honors SET XACT_ABORT. RAISERROR no lo hace.RAISERROR does not. Las nuevas aplicaciones deben usar THROW en vez de RAISERROR.New applications should use THROW instead of RAISERROR.

Especifica si SQL ServerSQL Server revierte automáticamente la transacción actual cuando una instrucción Transact-SQLTransact-SQL genera un error en tiempo de ejecución.Specifies whether SQL ServerSQL Server automatically rolls back the current transaction when a Transact-SQLTransact-SQL statement raises a run-time error.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

SET XACT_ABORT { ON | OFF }

NotasRemarks

Cuando SET XACT_ABORT es ON, si una instrucción Transact-SQLTransact-SQL genera un error en tiempo de ejecución, se termina toda la transacción y se revierte.When SET XACT_ABORT is ON, if a Transact-SQLTransact-SQL statement raises a run-time error, the entire transaction is terminated and rolled back.

Cuando SET XACT_ABORT es OFF, en algunos casos solo se revierte la instrucción Transact-SQLTransact-SQL que generó el error y la transacción continúa procesándose.When SET XACT_ABORT is OFF, in some cases only the Transact-SQLTransact-SQL statement that raised the error is rolled back and the transaction continues processing. Dependiendo de la gravedad del error, se puede revertir toda la transacción aun cuando SET XACT_ABORT sea OFF.Depending upon the severity of the error, the entire transaction may be rolled back even when SET XACT_ABORT is OFF. OFF es el valor predeterminado en una instrucción T-SQL, mientras que ON es el de un desencadenador.OFF is the default setting in a T-SQL statement, while ON is the default setting in a trigger.

Los errores de compilación, como los de sintaxis, no se ven afectados por SET XACT_ABORT.Compile errors, such as syntax errors, are not affected by 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 ServerSQL Server.XACT_ABORT must be set ON for data modification statements in an implicit or explicit transaction against most OLE DB providers, including SQL ServerSQL Server. El único caso donde no se requiere esta opción es si el proveedor acepta transacciones anidadas.The only case where this option is not required is if the provider supports nested transactions.

Cuando ANSI_WARNINGS=OFF, las infracciones de los permisos hacen que se anulen las transacciones.When ANSI_WARNINGS=OFF, permissions violations cause transactions to abort.

La opción SET XACT_ABORT se establece en tiempo de ejecución, no en tiempo de análisis.The setting of SET XACT_ABORT is set at execute or run time and not at parse time.

Para ver la configuración actual de este valor, ejecute la consulta siguiente.To view the current setting for this setting, run the following query.

DECLARE @XACT_ABORT VARCHAR(3) = 'OFF';
IF ( (16384 & @@OPTIONS) = 16384 ) SET @XACT_ABORT = 'ON';
SELECT @XACT_ABORT AS XACT_ABORT;

EjemplosExamples

El siguiente código de ejemplo genera un error de infracción de clave externa en una transacción que tiene otras instrucciones Transact-SQLTransact-SQL.The following code example causes a foreign key violation error in a transaction that has other Transact-SQLTransact-SQL statements. 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.In the first set of statements, the error is generated, but the other statements execute successfully and the transaction is successfully committed. En el segundo conjunto de instrucciones, SET XACT_ABORT se establece en ON.In the second set of statements, SET XACT_ABORT is set to ON. Esto hace que el error en la instrucción suspenda el lote y revierta la transacción.This causes the statement error to terminate the batch and the transaction is rolled back.

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énSee Also