Partekatu honen bidez:


XACT_STATE (Transact-SQL)

Aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Analítica (PDW)Base de datos SQL en Microsoft Fabric

Es una función escalar que informa del estado de transacción de usuario de la sesión actual. XACT_STATE indica si la sesión tiene una transacción de usuario activa y si la transacción es capaz de confirmarse.

Convenciones de sintaxis de Transact-SQL

Sintaxis

XACT_STATE()

Nota:

El grupo de SQL sin servidor no admite esta sintaxis en Azure Synapse Analytics.

Tipos de retorno

smallint

Observaciones

XACT_STATE devuelve los valores siguientes.

Valor devuelto Description
1 La sesión actual tiene una transacción de usuario activa. La sesión puede realizar cualquier acción, incluida la escritura de datos y la confirmación de la transacción.
0 No hay ninguna transacción de usuario activa para la sesión actual.
-1 La sesión actual tiene una transacción de usuario activa, pero se produjo un error que provocó que la transacción se clasifique como una transacción no confirmable. La sesión no puede confirmar la transacción ni revertir a un punto de guardado; solo puede solicitar una reversión completa de la transacción. La sesión no puede realizar ninguna operación de escritura hasta que revierte la transacción. La sesión solo puede realizar operaciones de lectura hasta que revierte la transacción. Después de revertir la transacción, la sesión puede realizar operaciones de lectura y escritura y puede iniciar una nueva transacción.

Cuando el lote más externo termina de ejecutarse, el motor de base de datos revierte automáticamente las transacciones no confirmables activas. Si no se envió ningún mensaje de error cuando la transacción entró en un estado no confirmable, cuando finaliza el lote, se envía un mensaje de error a la aplicación cliente. Este mensaje indica que se detectó y revirtió una transacción no confirmable.

Tanto las funciones como @@TRANCOUNT se XACT_STATE pueden usar para detectar si la sesión actual tiene una transacción de usuario activa. @@TRANCOUNT no se puede usar para determinar si esa transacción se clasifica como una transacción no confirmable. XACT_STATE no se puede usar para determinar si hay transacciones internas.

Ejemplos

Los ejemplos de código de este artículo usan la base de datos de ejemplo de AdventureWorks2025 o AdventureWorksDW2025, que puede descargar de la página principal de Ejemplos de Microsoft SQL Server y proyectos de comunidad.

En el ejemplo siguiente se utiliza XACT_STATE en el bloque CATCH de una construcción TRY...CATCH para determinar si se debe confirmar o revertir una transacción. Como SET XACT_ABORT está en el estado ON, el error de infracción de restricción hace que la transacción pase a un estado no confirmable.

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