XACT_STATE (Transact-SQL)

Eine Skalarfunktion, die den Status einer Benutzertransaktion einer zurzeit ausgeführten Anforderung meldet. XACT_STATE gibt an, ob für die Anforderung eine aktive Benutzertransaktion vorliegt und ob für die Transaktion ein Commit ausgeführt werden kann.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

XACT_STATE()

Rückgabetyp

smallint

Hinweise

XACT_STATE gibt folgende Werte zurück.

Rückgabewert

Bedeutung

1

Für die aktuelle Anforderung liegt eine aktive Benutzertransaktion vor. Die Anforderung kann beliebige Aktionen ausführen, z. B. können Daten geschrieben werden, und es kann ein Commit für die Transaktion ausgeführt werden.

0

Für die aktuelle Anforderung liegt keine aktive Benutzertransaktion vor.

-1

Für die aktuelle Anforderung liegt eine aktive Benutzertransaktion vor, allerdings ist ein Fehler aufgetreten, durch den die Transaktion als nicht commitfähig klassifiziert wurde. Die Anforderung kann für die Transaktion weder einen Commit noch ein Rollback zu einem Sicherungspunkt ausführen. Es ist lediglich möglich, ein vollständiges Rollback für die Transaktion anzufordern. Die Anforderung kann erst wieder Schreibvorgänge ausführen, wenn für die Transaktion ein Rollback ausgeführt wurde. Bis für die Transaktion ein Rollback ausgeführt wird, kann die Anforderung nur Lesevorgänge ausführen. Nachdem für die Transaktion ein Rollback ausgeführt worden ist, kann die Anforderung sowohl Lese- als auch Schreibvorgänge ausführen und eine neue Transaktion starten.

Nach Abschluss einer Batchausführung wird für alle aktiven nicht commitfähigen Transaktionen automatisch von Database Engine (Datenbankmodul) ein Rollback ausgeführt. Falls keine Fehlermeldung gesendet wurde, als die Transaktion in den nicht commitfähigen Status überging, wird bei Abschluss des Batches eine Fehlermeldung an die Clientanwendung gesendet. Durch diese Meldung wird angezeigt, dass eine nicht commitfähige Transaktion erkannt und ein Rollback für sie ausgeführt wurde. Weitere Informationen zu nicht commitfähigen Transaktionen finden Sie unter Verwenden von TRY...CATCH in Transact-SQL.

Sowohl über die XACT_STATE-Funktion als auch über die @@TRANCOUNT-Funktion kann ermittelt werden, ob für die aktuelle Anforderung eine aktive Benutzertransaktion vorliegt. Mit @@TRANCOUNT kann nicht bestimmt werden, ob die betreffende Transaktion als nicht commitfähig klassifiziert wurde. Mit XACT_STATE kann nicht bestimmt werden, ob geschachtelte Transaktionen vorhanden sind.

Beispiele

Im folgenden Beispiel wird XACT_STATE im CATCH-Block eines TRY…CATCH-Konstrukts verwendet, um zu bestimmen, ob für eine Transaktion ein Commit- oder Rollback-Vorgang ausgeführt werden soll. Da SET XACT_ABORT auf den Wert ON festgelegt ist, wird die Transaktion wegen des aufgrund der Einschränkungsverletzung aufgetretenen Fehlers in einen nicht commitfähigen Zustand versetzt.

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