SET XACT_ABORT (Transact-SQL)

Si applica a: sìSQL Server (tutte le versioni supportate) Sìdatabase SQL di Azure SìIstanza gestita di SQL di Azure sìAzure Synapse Analytics sìParallel Data Warehouse

Nota

L'istruzione THROW rispetta SET XACT_ABORT, a differenza di RAISERROR. Le nuove applicazioni devono usare THROW invece di RAISERROR.

Specifica se in SQL Server viene eseguito automaticamente il rollback della transazione corrente quando un'istruzione Transact-SQL genera un errore di run-time.

Icona di collegamento a un argomento Convenzioni della sintassi Transact-SQL

Sintassi

SET XACT_ABORT { ON | OFF }

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 e versioni precedenti, vedere Documentazione delle versioni precedenti.

Osservazioni

Quando l'opzione SET XACT_ABORT è impostata su ON, se un'istruzione Transact-SQL genera un errore di run-time l'intera transazione viene terminata e viene eseguito il rollback.

Quando l'opzione SET XACT_ABORT è impostata su OFF, in alcuni casi viene eseguito il rollback solo dell'istruzione Transact-SQL che ha generato l'errore e l'elaborazione della transazione continua. In base alla gravità dell'errore, viene eseguito il rollback dell'intera transazione anche se l'opzione SET XACT_ABORT è impostata su OFF. OFF è l'impostazione predefinita in un'istruzione T-SQL, mentre ON è l'impostazione predefinita in un trigger.

L'opzione SET XACT_ABORT non ha alcun effetto sugli errori di compilazione, quali gli errori di sintassi.

L'opzione XACT_ABORT deve essere impostata su ON per le istruzioni di modifica dei dati, in una transazione implicita o esplicita, eseguite sulla maggior parte dei provider OLE DB, compreso SQL Server. L'unico caso in cui questa opzione non è necessaria è quando il provider supporta transazioni nidificate.

Quando ANSI_WARNINGS=OFF, le violazioni delle autorizzazioni causano l'interruzione delle transazioni.

L'opzione SET XACT_ABORT viene impostata in fase di esecuzione, non in fase di analisi.

Per visualizzare l'impostazione corrente per questa impostazione, eseguire la query riportata di seguito.

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

Esempi

In questo esempio di codice viene generato un errore di violazione della chiave esterna in una transazione che include altre istruzioni Transact-SQL. L'errore viene generato nel primo set di istruzioni, ma le altre istruzioni vengono eseguite completamente e viene eseguito il commit completo della transazione. Nel secondo set di istruzioni l'opzione SET XACT_ABORT viene impostata su ON. In seguito all'errore di istruzione il batch viene pertanto interrotto e viene eseguito il rollback della transazione.

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

Vedere anche