Sdílet prostřednictvím


SET XACT_ABORT (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)databáze SQL v Microsoft Fabric

Poznámka:

Prohlášení THROW ctí SET XACT_ABORT. RAISERROR ne. Nové aplikace by měly používat THROW místo RAISERROR.

Specifikuje, zda SQL Server automaticky vrátí aktuální transakci, když příkaz Transact-SQL vyvolá chybu za běhu.

Transact-SQL konvence syntaxe

Syntaxe

SET XACT_ABORT { ON | OFF }

Poznámky

Když je SET XACT_ABORT zapnutý, pokud příkaz Transact-SQL vyvolá chybu za běhu, celá transakce je ukončena a vrácena zpět.

Když je SET XACT_ABORT vypnutý, v některých případech se zpět vrátí pouze Transact-SQL příkaz, který chybu způsobil, a transakce pokračuje ve zpracování. V závislosti na závažnosti chyby může být celá transakce vrácena zpět i tehdy, když je NASTAVIT XACT_ABORT VYPNUTO. VYPNUTO je výchozí nastavení v příkazu T-SQL, zatímco ZAPNUTO je výchozí nastavení v triggeru.

Chyby při kompilaci, jako jsou syntaktické chyby, nejsou ovlivněny SET XACT_ABORT.

XACT_ABORT musí být nastaveno ON pro příkazy o úpravě dat v implicitní nebo explicitní transakci vůči většině poskytovatelů OLE DB, včetně SQL Serveru. Jediný případ, kdy tato možnost není nutná, je, pokud poskytovatel podporuje vnořené transakce.

Když ANSI_WARNINGS=VYPNUTO, porušení oprávnění způsobí přerušení transakcí.

Nastavení SET XACT_ABORT je nastaveno při spuštění nebo běhu a nikoli při parse.

Pro zobrazení aktuálního nastavení tohoto nastavení spusťte následující dotaz.

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

Examples

Následující příklad kódu způsobuje chybu porušení cizího klíče v transakci, která obsahuje jiné Transact-SQL příkazy. V první sadě příkazů je chyba generována, ale ostatní příkazy se úspěšně spustí a transakce je úspěšně potvrzena. Ve druhé sadě tvrzení SET XACT_ABORT je nastaveno na ON. To způsobí, že chyba ve výpadku ukončí dávku a transakce se vrátí zpět.

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

Viz také