SET XACT_ABORT (Transact-SQL)

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 argomentoConvenzioni della sintassi Transact-SQL

Sintassi

SET XACT_ABORT { ON | OFF }

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.

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. Per ulteriori informazioni, vedere Query distribuite e transazioni distribuite.

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

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.

USE AdventureWorks2008R2;
GO
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