Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Database Azure
SQLInstans
Terkelola Azure SQLAzure Synapse Analytics
Sistem Platform Analitik (PDW)
Database SQL di Microsoft Fabric
Adalah fungsi skalar yang melaporkan status transaksi pengguna dari sesi saat ini.
XACT_STATE menunjukkan apakah sesi 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.
Tipe pengembalian
smallint
Keterangan
XACT_STATE mengembalikan nilai berikut.
| Nilai hasil | Description |
|---|---|
| 1 | Sesi saat ini memiliki transaksi pengguna aktif. Sesi dapat melakukan tindakan apa pun, termasuk menulis data dan melakukan transaksi. |
| 0 | Tidak ada transaksi pengguna aktif untuk sesi saat ini. |
| -1 | Sesi saat ini memiliki transaksi pengguna aktif, tetapi terjadi kesalahan yang menyebabkan transaksi diklasifikasikan sebagai transaksi yang tidak dapat diterapkan. Sesi tidak dapat melakukan transaksi atau mengembalikan ke titik penyimpanan; itu hanya dapat meminta pembatalan penuh transaksi. Sesi tidak dapat melakukan operasi tulis apa pun sampai menggulung balik transaksi. Sesi hanya dapat melakukan operasi baca hingga menggulung balik transaksi. Setelah transaksi digulung balik, sesi dapat melakukan operasi baca dan tulis dan dapat memulai transaksi baru. Ketika batch terluar selesai berjalan, Mesin Database 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 dikirim ke aplikasi klien. Pesan ini menunjukkan bahwa transaksi yang tidak dapat diterapkan terdeteksi dan digulung balik. |
XACT_STATE Fungsi dan @@TRANCOUNT dapat digunakan untuk mendeteksi apakah sesi saat ini memiliki transaksi pengguna aktif.
@@TRANCOUNT tidak dapat digunakan untuk menentukan apakah transaksi tersebut diklasifikasikan sebagai transaksi yang tidak dapat diterapkan.
XACT_STATE tidak dapat digunakan untuk menentukan apakah ada transaksi dalam.
Contoh
Sampel kode dalam artikel ini menggunakan database sampel AdventureWorks2025 atau AdventureWorksDW2025, yang dapat Anda unduh dari halaman beranda Sampel dan Proyek Komunitas Microsoft SQL Server.
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.
-- SET XACT_ABORT ON renders 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 generates a constraint violation error.
DELETE FROM Production.Product
WHERE ProductID = 980;
-- If the delete operation succeeds, commit the transaction. The CATCH
-- block does not execute.
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- 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;