Sdílet prostřednictvím


XACT_STATE (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)databáze SQL v Microsoft Fabric

Je skalární funkce, která hlásí stav transakce uživatele aktuální relace. XACT_STATE určuje, zda relace má aktivní transakci uživatele a zda je transakce schopna být potvrzena.

Transact-SQL konvence syntaxe

Syntaxe

XACT_STATE()

Poznámka:

Tato syntaxe není podporována bezserverovým fondem SQL ve službě Azure Synapse Analytics.

Návratové typy

smallint

Poznámky

XACT_STATE vrátí následující hodnoty.

Návratová hodnota Description
1 Aktuální relace má aktivní transakci uživatele. Relace může provádět jakékoli akce, včetně zápisu dat a potvrzení transakce.
0 Pro aktuální relaci neexistuje žádná aktivní transakce uživatele.
-1 Aktuální relace má aktivní transakci uživatele, ale došlo k chybě, která způsobila, že transakce byla klasifikována jako nekommitovatelná transakce. Relace nemůže potvrdit transakci nebo vrátit zpět do bodu uložení; může požadovat pouze úplné vrácení transakce zpět. Relace nemůže provádět žádné operace zápisu, dokud se transakce nevrátí zpět. Relace může provádět jen operace čtení, dokud transakce nevrátí zpět. Po vrácení transakce zpět může relace provádět operace čtení i zápisu a může zahájit novou transakci.

Po dokončení běhu vnější dávky databázový stroj automaticky vrátí všechny aktivní nekommitovatelné transakce. Pokud nebyla odeslána žádná chybová zpráva, když transakce zadala nekommitovatelný stav, po dokončení dávky se do klientské aplikace odešle chybová zpráva. Tato zpráva znamená, že byla detekována a vrácena zpět transakce bez závazku.

Funkce XACT_STATE i @@TRANCOUNT funkce lze použít ke zjištění, jestli má aktuální relace aktivní transakci uživatele. @@TRANCOUNT nelze použít k určení, zda je transakce klasifikována jako nekommitovatelná transakce. XACT_STATE nelze použít k určení, zda existují vnitřní transakce.

Examples

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

Následující příklad používá XACT_STATE v bloku CATCH konstruktu TRY...CATCH k určení, zda transakci commitovat nebo vrátit zpět. Protože SET XACT_ABORT je , ONchyba porušení omezení způsobí, že transakce vstoupí do stavu nezávazovatelného.

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