Udostępnij za pośrednictwem


XACT_STATE (Transact-SQL)

Jest funkcją wartość skalarna, które przedstawia stan transakcji użytkownika bieżącego żądania bieżące.XACT_STATE wskazuje, czy żądanie zawiera transakcję aktywnego użytkownika, a transakcja jest w stanie jest zatwierdzona.

Topic link iconKonwencje składni języka Transact-SQL

XACT_STATE()

Zwracany typ

smallint

Remarks

XACT_STATE zwraca następujące wartości.

Zwracanie wartości

Znaczenie

1

Bieżące żądanie ma transakcję aktywnego użytkownika.Żądanie może wykonywać żadnych działań, w tym zapisie danych i zatwierdzanie transakcji.

0

Brak aktywnego użytkownika transakcji dla bieżącego żądania.

-1

Bieżące żądanie ma transakcję aktywnego użytkownika, ale wystąpił błąd, który spowodował transakcji klasyfikowane jako transakcja niemożliwy do zatwierdzenia.Żądanie nie zatwierdzanie transakcji lub rolki do punkt bezpieczny; go może tylko żądanie pełnego wycofywania transakcji.Żądanie nie może wykonać żadnych operacji zapisu do czasu powoduje powrót transakcji.Żądanie tylko można wykonywać operacje odczytu, dopóki ponownie rolkach transakcji.Po transakcja została wycofana, żądanie może wykonać obu odczytu i zapisu operacji i można rozpocząć nowej transakcji.

Po zakończeniu partia wykonywania, Database Engine zostanie automatycznie wykonać wycofanie wszystkich aktywnych transakcji niemożliwy do zatwierdzenia. Jeśli żaden komunikat o błędzie nie została wysłana, gdy wprowadzona niemożliwy do zatwierdzenia stan transakcji po zakończeniu pracy partia, do aplikacji klienckiej wysyłany jest komunikat o błędzie.Ten komunikat oznacza, że transakcja niemożliwy do zatwierdzenia Wykryto i przywrócenie.Aby uzyskać więcej informacji o transakcjach niemożliwy do zatwierdzenia zobacz Za pomocą TRY... CATCH instrukcji języka Transact-SQL.

Funkcje XACT_STATE i @@ TRANCOUNT może służyć do wykrywać, czy bieżące żądanie znajduje się transakcja aktywnego użytkownika.@@ TRANCOUNT nie można użyć do określenia, czy jako transakcja niemożliwy do zatwierdzenia został sklasyfikowany danej transakcji.XACT_STATE nie można używać do ustalenia, czy są transakcji zagnieżdżonych.

Przykłady

W poniższym przykładzie użyto XACT_STATE w CATCH blokowanie z TRY…CATCH tworzyć, aby ustalić, czy przekazać lub wycofać transakcji. Ponieważ SET XACT_ABORT jest ON, transakcji wprowadzić niemożliwy do zatwierdzenia stan powoduje, że błąd naruszenia zasad ograniczeń.

USE AdventureWorks;
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