Udostępnij przez


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 zgłasza stan transakcji użytkownika bieżącej sesji. XACT_STATE wskazuje, czy sesja ma aktywną transakcję użytkownika i czy transakcja jest w stanie zostać zatwierdzona.

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.

Typy zwracane

smallint

Uwagi

XACT_STATE Zwraca następujące wartości.

Wartość zwracana Description
1 Bieżąca sesja ma aktywną transakcję użytkownika. Sesja może wykonywać dowolne akcje, w tym zapisywanie danych i zatwierdzanie transakcji.
0 Brak aktywnej transakcji użytkownika dla bieżącej sesji.
-1 Bieżąca sesja ma aktywną transakcję użytkownika, ale wystąpił błąd, który spowodował, że transakcja została sklasyfikowana jako transakcja nieuwierzytna. Sesja nie może zatwierdzić transakcji ani wycofać jej do punktu zapisu; może zażądać tylko pełnego wycofania transakcji. Sesja nie może wykonywać żadnych operacji zapisu, dopóki nie wycofa transakcji. Sesja może wykonywać tylko operacje odczytu, dopóki nie wycofa transakcji. Po wycofaniu transakcji sesja może wykonywać zarówno operacje odczytu, jak i zapisu i rozpocząć nową transakcję.

Po zakończeniu działania najbardziej zewnętrznej partii aparat bazy danych automatycznie wycofa wszystkie aktywne niezatwierdzonych transakcji. Jeśli żaden komunikat o błędzie nie został wysłany, gdy transakcja została wprowadzona w stanie niezatwierdzonych, po zakończeniu wsadu do aplikacji klienckiej zostanie wysłany komunikat o błędzie. Ten komunikat wskazuje, że wykryto i cofnięto transakcję niezatwierdzalną.

XACT_STATE Funkcje i @@TRANCOUNT mogą służyć do wykrywania, czy bieżąca sesja ma aktywną transakcję użytkownika. @@TRANCOUNT Nie można użyć polecenia w celu określenia, czy ta transakcja jest klasyfikowana jako transakcja niezwiązana. XACT_STATE Nie można użyć metody w celu określenia, czy istnieją transakcje wewnętrzne.

Przykłady

Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.

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.

-- SET XACT_ABORT ON renders 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 generates a constraint violation error.
        DELETE FROM Production.Product
            WHERE ProductID = 980;

    -- If the delete operation succeeds, commit the transaction. The CATCH
    -- block does not execute.
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    -- 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;