Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Aplica a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Sistema 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;