Bagikan melalui


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.

Konvensi sintaks transact-SQL

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)