XACT_STATE (SQL Bertransaksi)

Berlaku untuk:yes SQL Server (semua versi yang didukung) YesAzure SQL Database YesAzure SQL Managed Instance yesAzure Synapse Analytics Analytics yesPlatform 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.

Topic link iconKonvensi Sintaksis T-SQL

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)