XACT_STATE (T-SQL)
Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Adalah fungsi skalar yang melaporkan status transaksi pengguna dari permintaan yang sedang berjalan saat ini. XACT_STATE menunjukkan apakah permintaan memiliki transaksi pengguna aktif, dan apakah transaksi mampu dilakukan.
Sintaksis
XACT_STATE()
Catatan
Sintaks ini tidak didukung oleh kumpulan SQL tanpa server di Azure Synapse Analytics.
Jenis Hasil
smallint
Keterangan
XACT_STATE mengembalikan nilai berikut.
Nilai hasil | Makna |
---|---|
1 | Permintaan saat ini memiliki transaksi pengguna aktif. Permintaan dapat melakukan tindakan apa pun, termasuk menulis data dan melakukan transaksi. |
0 | Tidak ada transaksi pengguna aktif untuk permintaan saat ini. |
-1 | Permintaan saat ini memiliki transaksi pengguna aktif, tetapi telah terjadi kesalahan yang telah menyebabkan transaksi tersebut diklasifikasikan sebagai transaksi yang tidak dapat diterapkan. Permintaan tidak dapat menerapkan transaksi atau mengembalikan ke titik penyimpanan; itu hanya dapat meminta pembatalan penuh transaksi. Permintaan tidak dapat melakukan operasi tulis apa pun sampai menggulung balik transaksi. Permintaan hanya dapat melakukan operasi baca hingga menggulung balik transaksi. Setelah transaksi digulung balik, permintaan dapat melakukan operasi baca dan tulis dan dapat memulai transaksi baru. Ketika batch terluar selesai berjalan, Mesin Database akan secara otomatis mengembalikan transaksi aktif yang tidak dapat diterapkan. Jika tidak ada pesan kesalahan yang dikirim ketika transaksi memasuki status yang tidak dapat diterapkan, ketika batch selesai, pesan kesalahan akan dikirim ke aplikasi klien. Pesan ini menunjukkan bahwa transaksi yang tidak dapat diterapkan terdeteksi dan digulung balik. |
Fungsi XACT_STATE dan @@TRANCOUNT dapat digunakan untuk mendeteksi apakah permintaan saat ini memiliki transaksi pengguna aktif. @@TRANCOUNT tidak dapat digunakan untuk menentukan apakah transaksi tersebut telah diklasifikasikan sebagai transaksi yang tidak dapat diterapkan. XACT_STATE tidak dapat digunakan untuk menentukan apakah ada transaksi berlapis.
Contoh
Contoh berikut menggunakan XACT_STATE
dalam CATCH
blok TRY...CATCH
konstruksi untuk menentukan apakah akan menerapkan atau mengembalikan transaksi. Karena SET XACT_ABORT
adalah ON
, kesalahan pelanggaran batasan menyebabkan transaksi memasuki status yang tidak dapat dikomit.
USE AdventureWorks2022;
GO
-- SET XACT_ABORT ON will render the transaction uncommittable
-- when the constraint violation occurs.
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
-- A FOREIGN KEY constraint exists on this table. This
-- statement will generate a constraint violation error.
DELETE FROM Production.Product
WHERE ProductID = 980;
-- If the delete operation succeeds, commit the transaction. The CATCH
-- block will not execute.
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- Test XACT_STATE for 0, 1, or -1.
-- If 1, the transaction is committable.
-- If -1, the transaction is uncommittable and should
-- be rolled back.
-- XACT_STATE = 0 means there is no transaction and
-- a commit or rollback operation would generate an error.
-- Test whether the transaction is uncommittable.
IF (XACT_STATE()) = -1
BEGIN
PRINT 'The transaction is in an uncommittable state.' +
' Rolling back transaction.'
ROLLBACK TRANSACTION;
END;
-- Test whether the transaction is active and valid.
IF (XACT_STATE()) = 1
BEGIN
PRINT 'The transaction is committable.' +
' Committing transaction.'
COMMIT TRANSACTION;
END;
END CATCH;
GO
Lihat Juga
@@TRANCOUNT (T-SQL)
BEGIN TRANSACTION (Transact-SQL)
TRANSAKSI PENERAPAN (T-SQL)
TRANSAKSI ROLLBACK (Transact-SQL)
SIMPAN TRANSAKSI (T-SQL)
COBA... CATCH (Transact-SQL)