SET XACT_ABORT (SQL Bertransaksi)
Berlaku untuk:
SQL Server (semua versi yang didukung)
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics 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.
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
