XACT_STATE (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-databas i Microsoft Fabric

Är en skalär funktion som rapporterar användarens transaktionstillstånd för en aktuell körande förfrågan. XACT_STATE anger om förfrågan har en aktiv användartransaktion och om transaktionen kan commitas.

Transact-SQL syntaxkonventioner

Syntax

XACT_STATE()  

Anmärkning

Den här syntaxen stöds inte av en serverlös SQL-pool i Azure Synapse Analytics.

Returtyp

smallint

Anmärkningar

XACT_STATE returnerar följande värden.

Returvärde Meaning
1 Den aktuella förfrågan har en aktiv användartransaktion. Begäran kan utföra alla åtgärder, inklusive att skriva data och genomföra transaktionen.
0 Det finns ingen aktiv användartransaktion för den aktuella förfrågan.
-1 Den aktuella förfrågan har en aktiv användartransaktion, men ett fel har inträffat som har gjort att transaktionen klassificerats som en icke-committable transaktion. Begäran kan inte committa transaktionen eller rulla tillbaka till en sparpunkt; Den kan bara begära en fullständig återställning av transaktionen. Begäran kan inte utföra några skrivoperationer förrän den rullar tillbaka transaktionen. Begäran kan endast utföra läsoperationer tills den rullar tillbaka transaktionen. Efter att transaktionen har rullats tillbaka kan förfrågan utföra både läs- och skrivoperationer och kan starta en ny transaktion.

När den yttersta batchen är klar kommer databasmotorn automatiskt att rulla tillbaka alla aktiva, icke-committable transaktioner. Om inget felmeddelande skickades när transaktionen gick in i ett icke-committabelt tillstånd, kommer ett felmeddelande att skickas till klientapplikationen när batchen är klar. Detta meddelande indikerar att en ocommittable transaktion upptäcktes och rullades tillbaka.

Både XACT_STATE- och @@TRANCOUNT-funktionerna kan användas för att upptäcka om den aktuella förfrågan har en aktiv användartransaktion. @@TRANCOUNT kan inte användas för att avgöra om den transaktionen har klassificerats som en ocommittable transaktion. XACT_STATE kan inte användas för att avgöra om det finns nästlade transaktioner.

Examples

Följande exempel använder XACT_STATE i blocket CATCH av en TRY...CATCH konstruktion för att avgöra om en transaktion ska committas eller rullas tillbaka. Eftersom SET XACT_ABORT är ON, orsakar begränsningsbrottet att transaktionen går in i ett icke-committabelt tillstånd.

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  

Se även

@@TRANCOUNT (Transact-SQL)
STARTA TRANSAKTION (Transact-SQL)
ÖVERLÅTA TRANSAKTION (Transact-SQL)
ÅTERSTÄLLNINGSTRANSAKTION (Transact-SQL)
SPARA TRANSAKTION (Transact-SQL)
TRY... CATCH (Transact-SQL)