Udostępnij za pomocą


XACT_STATE (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Database w Microsoft Fabric

Jest funkcją skalarną, która raportuje stan transakcji użytkownika aktualnie działającego żądania. XACT_STATE wskazuje, czy żądanie zawiera aktywną transakcję użytkownika oraz czy transakcja jest zdolna do zatwierdzenia.

Transact-SQL konwencje składni

Składnia

XACT_STATE()  

Uwaga / Notatka

Ta składnia nie jest obsługiwana przez bezserwerową pulę SQL w usłudze Azure Synapse Analytics.

Zwracany typ

smallint

Uwagi

XACT_STATE zwraca następujące wartości.

Wartość zwracana Meaning
1 Aktualne żądanie ma aktywną transakcję użytkownika. Żądanie może wykonać dowolne czynności, w tym zapisywać dane i zatwierdzać transakcję.
0 Nie ma aktywnej transakcji użytkownika dla bieżącego żądania.
-1 Aktualne żądanie ma aktywną transakcję użytkownika, ale wystąpił błąd, który spowodował, że transakcja została sklasyfikowana jako transakcja niezatwierdzalna. Żądanie nie może zatwierdzać transakcji ani cofnąć się do punktu zapisu; Może jedynie zażądać pełnego cofnięcia transakcji. Żądanie nie może wykonać żadnych operacji zapisu, dopóki nie cofnie transakcji. Żądanie może wykonywać operacje odczytu tylko do momentu cofnięcia transakcji. Po cofnięciu transakcji żądanie może wykonywać zarówno operacje odczytu, jak i zapisu oraz rozpocząć nową transakcję.

Gdy najbardziej zewnętrzna partia zakończy działanie, silnik bazy danych automatycznie cofnie wszystkie aktywne, niezatwierdzalne transakcje. Jeśli nie wysłano komunikatu o błędzie, gdy transakcja weszła w stan niezatwierdzalny, po zakończeniu partii zostanie wysłany komunikat o błędzie do aplikacji klienckiej. Ten komunikat wskazuje, że wykryto i cofnięto transakcję niezatwierdzalną.

Zarówno funkcje XACT_STATE, jak i @@TRANCOUNT mogą być używane do wykrywania, czy aktualne żądanie zawiera aktywną transakcję użytkownika. @@TRANCOUNT nie może być użyte do ustalenia, czy transakcja została sklasyfikowana jako transakcja niezatwierdzalna. XACT_STATE nie może być użyte do określenia, czy istnieją transakcje zagnieżdżone.

Przykłady

Poniższy przykład wykorzystuje XACT_STATE w bloku CATCHTRY...CATCH konstrukcję do określenia, czy zatwierdzić, czy cofnąć transakcję. Ponieważ SET XACT_ABORT jest , ONbłąd naruszenia ograniczeń powoduje, że transakcja wchodzi w stan niezatwierdzalny.

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  

Zobacz też

@@TRANCOUNT (Transact-SQL)
ROZPOCZNIJ TRANSAKCJĘ (Transact-SQL)
TRANSAKCJA COMMIT (Transact-SQL)
WYCOFYWANIA TRANSAKCJI (Transact-SQL)
ZAPISZ TRANSAKCJĘ (Transact-SQL)
TRY... CATCH (Transact-SQL)