XACT_STATE (Transact-SQL)

Actualizado: 14 de abril de 2006

Función escalar que notifica el estado de la transacción de usuario de una solicitud que se está ejecutando actualmente. XACT_STATE indica si la solicitud tiene una transacción de usuario activa y si se puede confirmar la transacción.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

XACT_STATE()

Tipo de valor devuelto

smallint

Notas

XACT_STATE devuelve los siguientes valores.

Valor devuelto Significado

1

La solicitud actual tiene una transacción de usuario activa. La solicitud 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 solicitud actual.

-1

La solicitud actual tiene una transacción de usuario activa, pero se ha producido un error por el cual la transacción se clasificó como no confirmable. La solicitud no puede confirmar la transacción o revertirla a un punto de almacenamiento; sólo puede solicitar que la transacción se revierta completamente. Tampoco puede realizar operaciones de escritura hasta que se revierta la transacción. Mientras tanto, sólo puede realizar operaciones de lectura. Una vez que la transacción se ha revertido, la solicitud puede realizar operaciones de lectura y escritura, y puede iniciar transacciones nuevas.

Cuando finalice la ejecución de un lote, el Database Engine (Motor de base de datos) revertirá automáticamente todas 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 finalice la ejecución del lote se enviará un mensaje de error a la aplicación cliente. Este mensaje indica que se detectó y revirtió una transacción no confirmable. Para obtener más información acerca de las transacciones que no pueden confirmarse, vea Usar TRY...CATCH en Transact-SQL.

Las funciones XACT_STATE y @@TRANCOUNT pueden utilizarse para detectar si la solicitud actual tiene o no una transacción de usuario activa. No se puede utilizar @@TRANCOUNT para determinar si esa transacción se ha clasificado como no confirmable. No se puede utilizar XACT_STATE para determinar si hay transacciones anidadas.

Ejemplos

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 que no se puede confirmar.

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

Vea también

Referencia

@@TRANCOUNT (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)
TRY...CATCH (Transact-SQL)

Otros recursos

Usar TRY...CATCH en Transact-SQL
Transacciones (motor de la base de datos)

Ayuda e información

Obtener ayuda sobre SQL Server 2005

Historial de cambios

Versión Historial

14 de abril de 2006

Contenido nuevo:
  • Se agregó información sobre un cambio de comportamiento de las transacciones no confirmables.
Contenido modificado:
  • Se aclaró la información sobre solicitudes y transacciones.