XACT_STATE (SQL Bertransaksi)
Berlaku untuk:
SQL Server (semua versi yang didukung)
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.
Sintaks
XACT_STATE()
Catatan
Untuk melihat sintaks transact-SQL untuk SQL Server 2014 dan yang lebih lama, lihat Dokumentasi versi sebelumnya.
Catatan
Sintaks ini tidak didukung oleh kumpulan SQL tanpa server di Azure Synapse Analytics.
Jenis Hasil
smallint
Keterangan
XACT_STATE mengembalikan nilai berikut.
| Mengembalikan nilai | 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 melakukan 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 sampai 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 dikomit. Jika tidak ada pesan kesalahan yang dikirim ketika transaksi memasuki status 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 melakukan atau mengembalikan transaksi. Karena SET XACT_ABORT adalah ON, kesalahan pelanggaran batasan menyebabkan transaksi memasuki status tidak dapat dikomit.
USE AdventureWorks2012;
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 (SQL Bertransaksi)
BEGIN TRANSACTION (Transact-SQL)
TRANSAKSI PENERAPAN (SQL Bertransaksi)
TRANSAKSI ROLLBACK (SQL Bertransaksi)
SIMPAN TRANSAKSI (SQL Bertransaksi)
MENCOBA... CATCH (SQL Bertransaksi)
