Bagikan melalui


XACT_STATE (T-SQL)

Berlaku untuk:SQL ServerDatabase Azure SQLInstans Terkelola Azure SQLAzure Synapse AnalyticsSistem 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.

Konvensi sintaks transact-SQL

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;