SET XACT_ABORT (SQL Bertransaksi)

Berlaku untuk:yes SQL Server (semua versi yang didukung) YesAzure SQL Database YesAzure SQL Managed Instance yesAzure Synapse Analytics yesAnalytics Platform System (PDW)

Catatan

Pernyataan THROW menghormati set XACT_ABORT. RAISERROR tidak. Aplikasi baru harus menggunakan THROW alih-alih RAISERROR.

Menentukan apakah SQL Server secara otomatis mengembalikan transaksi saat ini saat pernyataan Transact-SQL menimbulkan kesalahan run-time.

Topic link iconKonvensi Sintaksis T-SQL

Sintaks

SET XACT_ABORT { ON | OFF }

Catatan

Untuk melihat sintaks transact-SQL untuk SQL Server 2014 dan yang lebih lama, lihat Dokumentasi versi sebelumnya.

Keterangan

Ketika SET XACT_ABORT AKTIF, jika pernyataan Transact-SQL menimbulkan kesalahan run-time, seluruh transaksi dihentikan dan digulung balik.

Ketika SET XACT_ABORT NONAKTIF, dalam beberapa kasus hanya pernyataan SQL Transact yang memunculkan kesalahan digulung balik dan transaksi terus diproses. Bergantung pada tingkat keparahan kesalahan, seluruh transaksi dapat digulung balik bahkan ketika SET XACT_ABORT NONAKTIF. OFF adalah pengaturan default dalam pernyataan T-SQL, sementara AKTIF adalah pengaturan default dalam pemicu.

Kompilasi kesalahan, seperti kesalahan sintaksis, tidak terpengaruh oleh SET XACT_ABORT.

XACT_ABORT harus diatur AKTIF untuk pernyataan modifikasi data dalam transaksi implisit atau eksplisit terhadap sebagian besar penyedia OLE DB, termasuk SQL Server. Satu-satunya kasus di mana opsi ini tidak diperlukan adalah jika penyedia mendukung transaksi berlapis.

Saat ANSI_WARNINGS=OFF, pelanggaran izin menyebabkan transaksi dibatalkan.

Pengaturan SET XACT_ABORT diatur pada waktu eksekusi atau eksekusi dan bukan pada waktu penguraian.

Untuk menampilkan pengaturan saat ini untuk pengaturan ini, jalankan kueri berikut.

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

Contoh

Contoh kode berikut menyebabkan kesalahan pelanggaran kunci asing dalam transaksi yang memiliki pernyataan SQL Transact lainnya. Dalam serangkaian pernyataan pertama, kesalahan dihasilkan, tetapi pernyataan lain berhasil dijalankan dan transaksi berhasil dilakukan. Dalam kumpulan pernyataan kedua, SET XACT_ABORT diatur ke ON. Hal ini menyebabkan kesalahan pernyataan untuk mengakhiri batch dan transaksi digulung balik.

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

Lihat juga