Delen via


XACT_STATE (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Database in Microsoft Fabric

Is een scalaire functie die de gebruikerstransactiestatus van een actueel lopend verzoek rapporteert. XACT_STATE geeft aan of het verzoek een actieve gebruikerstransactie heeft en of de transactie kan worden gecommit.

Transact-SQL syntaxis-conventies

Syntaxis

XACT_STATE()  

Opmerking

Deze syntaxis wordt niet ondersteund door een serverloze SQL-pool in Azure Synapse Analytics.

Retourtype

smallint

Opmerkingen

XACT_STATE geeft de volgende waarden terug.

Retourwaarde Meaning
1 Het huidige verzoek heeft een actieve gebruikerstransactie. Het verzoek kan alle acties uitvoeren, waaronder het schrijven van gegevens en het committen van de transactie.
0 Er is geen actieve gebruikerstransactie voor het huidige verzoek.
-1 Het huidige verzoek heeft een actieve gebruikerstransactie, maar er is een fout opgetreden waardoor de transactie als een niet-committable transactie is geclassificeerd. Het verzoek kan de transactie niet committen of terugrollen naar een savepoint; Het kan alleen een volledige terugrol van de transactie aanvragen. Het verzoek kan geen schrijfbewerkingen uitvoeren totdat het de transactie terugrolt. Het verzoek kan alleen leesbewerkingen uitvoeren totdat de transactie wordt teruggerold. Nadat de transactie is teruggerold, kan het verzoek zowel lees- als schrijfoperaties uitvoeren en kan een nieuwe transactie starten.

Wanneer de buitenste batch is uitgevoerd, rolt de Database Engine automatisch alle actieve, niet-committable transacties terug. Als er geen foutmelding werd verzonden toen de transactie in een niet-committable toestand kwam, wordt er na afloop van de batch een foutmelding naar de clientapplicatie gestuurd. Dit bericht geeft aan dat een niet-committable transactie is gedetecteerd en teruggedraaid.

Zowel de XACT_STATE- als de @@TRANCOUNT-functies kunnen worden gebruikt om te detecteren of het huidige verzoek een actieve gebruikerstransactie heeft. @@TRANCOUNT kan niet worden gebruikt om te bepalen of die transactie als een niet-committable transactie is geclassificeerd. XACT_STATE kan niet worden gebruikt om te bepalen of er geneste transacties zijn.

Voorbeelden

Het volgende voorbeeld gebruikt XACT_STATE in het CATCH blok van een TRY...CATCH construct om te bepalen of een transactie moet committen of teruggerold moet worden. Omdat SET XACT_ABORT is ON, zorgt de constraint-overtredingfout ervoor dat de transactie in een niet-committable toestand komt.

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  

Zie ook

@@TRANCOUNT (Transact-SQL)
BEGIN TRANSACTIE (Transact-SQL)
DOORVOERTRANSACTIE (Transact-SQL)
TRANSACTIE voor terugdraaien (Transact-SQL)
TRANSACTIE OPSLAAN (Transact-SQL)
TRY... CATCH (Transact-SQL)