Partilhar via


XACT_STATE (Transact-SQL)

Aplica-se a:Banco de Dados SQL doAzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)Banco de Dados SQL no Microsoft Fabric

É uma função escalar que reporta o estado da transação do utilizador de um pedido em execução. XACT_STATE indica se o pedido tem uma transação de utilizador ativo e se a transação pode ser comprometida.

Transact-SQL convenções de sintaxe

Sintaxe

XACT_STATE()  

Observação

Essa sintaxe não é suportada pelo pool SQL sem servidor no Azure Synapse Analytics.

Tipo de Retorno

smallint

Observações

XACT_STATE devolve os seguintes valores.

Valor de retorno Meaning
1 O pedido atual tem uma transação de utilizador ativo. O pedido pode realizar quaisquer ações, incluindo escrever dados e comprometer a transação.
0 Não há transação ativa de utilizador para o pedido atual.
-1 O pedido atual tem uma transação de utilizador ativa, mas ocorreu um erro que fez com que a transação fosse classificada como não comprometível. O pedido não pode comprometer a transação nem reverter para um ponto de gravação; Só pode pedir uma reversão total da transação. O pedido não pode realizar quaisquer operações de escrita até reverter a transação. O pedido só pode realizar operações de leitura até reverter a transação. Depois de a transação ser revertida, o pedido pode realizar operações de leitura e escrita e iniciar uma nova transação.

Quando o lote mais externo termina de correr, o Motor de Base de Dados reverte automaticamente quaisquer transações ativas não comprometidas. Se não for enviada nenhuma mensagem de erro quando a transação entrou num estado de não comprometimento, quando o lote terminar, será enviada uma mensagem de erro para a aplicação cliente. Esta mensagem indica que uma transação não comprometível foi detetada e revertida.

Tanto as funções XACT_STATE como @@TRANCOUNT podem ser usadas para detetar se o pedido atual tem uma transação de utilizador ativa. @@TRANCOUNT não pode ser usado para determinar se essa transação foi classificada como uma transação não comprometível. XACT_STATE não podem ser usados para determinar se existem transações aninhadas.

Examples

O exemplo seguinte utiliza XACT_STATE o bloco CATCH de um TRY...CATCH construto para determinar se deve comprometer ou reverter uma transação. Como SET XACT_ABORT é ON, o erro de violação de restrições faz com que a transação entre num estado de não comprometimento.

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  

Ver também

@@TRANCOUNT (Transact-SQL)
INICIAR TRANSAÇÃO (Transact-SQL)
TRANSAÇÃO COMMIT (Transact-SQL)
TRANSAÇÃO DE REVERSÃO (Transact-SQL)
SALVAR TRANSAÇÃO (Transact-SQL)
TENTE... CAPTURAR (Transact-SQL)