Compartilhar via


XACT_STATE (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW)

É uma função escalar que informa o estado de transação de usuário de uma solicitação em execução atualmente. XACT_STATE indica se a solicitação tem uma transação de usuário ativa e se a transação consegue ser confirmada.

Convenções de sintaxe de Transact-SQL

Sintaxe

XACT_STATE()  

Observação

Não há suporte a essa sintaxe para o pool de SQL sem servidor no Azure Synapse Analytics.

Tipo de retorno

smallint

Comentários

XACT_STATE retorna um dos valores a seguir.

Valor retornado Significado
1 A solicitação atual tem uma transação de usuário ativa. A solicitação pode executar qualquer ação, inclusive escrever dados e confirmar a transação.
0 Não há transação de usuário ativa para a solicitação atual.
-1 A solicitação atual tem uma transação de usuário ativa, mas ocorreu um erro que fez a transação ser classificada como não confirmável. A solicitação não pode confirmar a transação ou reverter para um ponto de salvamento; ela só pode solicitar uma reversão completa da transação. A solicitação não pode executar nenhuma operação de gravação reverter a transação. A solicitação só pode executar operações de leitura até reverter a transação. Depois que a transação é revertida, a solicitação pode executar operações de leitura e gravação e pode começar uma nova transação.

Quando um lote externo conclui a execução, o Mecanismo de Banco de Dados reverte automaticamente todas as transações ativas não confirmáveis. Se nenhuma mensagem de erro foi enviada quando a transação entrou em um estado não confirmável, quando o lote terminar, uma mensagem de erro será enviada ao aplicativo cliente. Essa mensagem indica que uma transação não confirmável foi detectada e revertida.

As funções XACT_STATE e @@TRANCOUNT podem ser usadas para detectar se a solicitação atual tem uma transação de usuário ativa. @@TRANCOUNT não pode ser usado para determinar se essa transação foi classificada como uma transação não confirmável. XACT_STATE não pode ser usado para determinar se há transações aninhadas.

Exemplos

O exemplo a seguir usa XACT_STATE no bloco CATCH de uma construção TRY...CATCH para determinar se uma transação será confirmada ou revertida. Como SET XACT_ABORT é ON, o erro de violação de restrição faz a transação entrar em um estado não confirmável.

USE AdventureWorks2022;  
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 Também

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