Freigeben über


XACT_STATE (Transact-SQL)

Gilt für:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-Datenbank in Microsoft Fabric

Ist eine skalare Funktion, die den Status der Benutzertransaktion der aktuellen Sitzung meldet. XACT_STATE gibt an, ob die Sitzung über eine aktive Benutzertransaktion verfügt und ob die Transaktion zugesichert werden kann.

Transact-SQL-Syntaxkonventionen

Syntax

XACT_STATE()

Hinweis

Diese Syntax wird vom serverlosen SQL-Pool in Azure Synapse Analytics nicht unterstützt.

Rückgabetypen

smallint

Hinweise

XACT_STATE gibt die folgenden Werte zurück.

Rückgabewert Description
1 Die aktuelle Sitzung verfügt über eine aktive Benutzertransaktion. Die Sitzung kann alle Aktionen ausführen, einschließlich des Schreibens von Daten und commit für die Transaktion.
0 Für die aktuelle Sitzung gibt es keine aktive Benutzertransaktion.
-1 Die aktuelle Sitzung verfügt über eine aktive Benutzertransaktion, aber es ist ein Fehler aufgetreten, der dazu führte, dass die Transaktion als nicht auskommentierbare Transaktion klassifiziert wurde. Die Sitzung kann die Transaktion nicht übernehmen oder ein Rollback auf einen Speicherpunkt ausführen. sie kann nur ein vollständiges Rollback der Transaktion anfordern. Die Sitzung kann keine Schreibvorgänge ausführen, bis die Transaktion zurückgesetzt wird. Die Sitzung kann nur Lesevorgänge ausführen, bis die Transaktion zurückgesetzt wird. Nachdem die Transaktion zurückgesetzt wurde, kann die Sitzung Lese- und Schreibvorgänge ausführen und eine neue Transaktion starten.

Wenn die Ausführung des äußersten Batches abgeschlossen ist, setzt das Datenbankmodul automatisch alle aktiven nicht auskommentierbaren Transaktionen zurück. Wenn keine Fehlermeldung gesendet wurde, wenn die Transaktion einen nicht aussetzbaren Zustand eingegeben hat, wird beim 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.

Sowohl die Funktionen @@TRANCOUNT als auch die XACT_STATE Funktionen können verwendet werden, um zu ermitteln, ob die aktuelle Sitzung über eine aktive Benutzertransaktion verfügt. @@TRANCOUNT kann nicht verwendet werden, um zu bestimmen, ob diese Transaktion als nicht auskommentierbare Transaktion klassifiziert wird. XACT_STATE kann nicht verwendet werden, um festzustellen, ob innere Transaktionen vorhanden sind.

Beispiele

Die Codebeispiele in diesem Artikel verwenden die AdventureWorks2025- oder AdventureWorksDW2025 Beispieldatenbank, die Sie von der Microsoft SQL Server Samples and Community Projects Homepage herunterladen können.

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.

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