XACT_STATE (Transact-SQL)XACT_STATE (Transact-SQL)

SE APLICA A: síSQL Server síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Función escalar que notifica el estado de la transacción de usuario de una solicitud que se está ejecutando actualmente.Is a scalar function that reports the user transaction state of a current running request. XACT_STATE indica si la solicitud tiene una transacción de usuario activa y si se puede confirmar la transacción.XACT_STATE indicates whether the request has an active user transaction, and whether the transaction is capable of being committed.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

XACT_STATE()  

Tipo devueltoReturn Type

smallintsmallint

NotasRemarks

XACT_STATE devuelve los siguientes valores.XACT_STATE returns the following values.

Valor devueltoReturn value SignificadoMeaning
11 La solicitud actual tiene una transacción de usuario activa.The current request has an active user transaction. La solicitud puede realizar cualquier acción, incluida la escritura de datos y la confirmación de la transacción.The request can perform any actions, including writing data and committing the transaction.
00 No hay ninguna transacción de usuario activa para la solicitud actual.There is no active user transaction for the current request.
-1-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.The current request has an active user transaction, but an error has occurred that has caused the transaction to be classified as an uncommittable transaction. La solicitud no puede confirmar la transacción o revertirla a un punto de retorno; solo puede solicitar que la transacción se revierta completamente.The request cannot commit the transaction or roll back to a savepoint; it can only request a full rollback of the transaction. Tampoco puede realizar operaciones de escritura hasta que se revierta la transacción.The request cannot perform any write operations until it rolls back the transaction. Mientras tanto, solo puede realizar operaciones de lectura.The request can only perform read operations until it rolls back the transaction. Una vez que la transacción se ha revertido, la solicitud puede realizar operaciones de lectura y escritura, y puede iniciar transacciones nuevas.After the transaction has been rolled back, the request can perform both read and write operations and can begin a new transaction.

Cuando finalice la ejecución del lote más exterior, el Motor de base de datosDatabase Engine revertirá automáticamente todas las transacciones no confirmables activas.When the outermost batch finishes running, the Motor de base de datosDatabase Engine will automatically roll back any active uncommittable transactions. 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.If no error message was sent when the transaction entered an uncommittable state, when the batch finishes, an error message will be sent to the client application. Este mensaje indica que se detectó y revirtió una transacción no confirmable.This message indicates that an uncommittable transaction was detected and rolled back.

Las funciones XACT_STATE y @@TRANCOUNT pueden usarse para detectar si la solicitud actual tiene o no una transacción de usuario activa.Both the XACT_STATE and @@TRANCOUNT functions can be used to detect whether the current request has an active user transaction. No se puede usar @@TRANCOUNT para determinar si esa transacción se ha clasificado como no confirmable.@@TRANCOUNT cannot be used to determine whether that transaction has been classified as an uncommittable transaction. No se puede utilizar XACT_STATE para determinar si hay transacciones anidadas.XACT_STATE cannot be used to determine whether there are nested transactions.

EjemplosExamples

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.The following example uses XACT_STATE in the CATCH block of a TRY...CATCH construct to determine whether to commit or roll back a transaction. 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.Because SET XACT_ABORT is ON, the constraint violation error causes the transaction to enter an uncommittable state.

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

Consulte tambiénSee Also

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