Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Sistema de Plataforma de Análise (PDW)
Banco de dados SQL no Microsoft Fabric
É uma função escalar que relata o estado da transação do usuário da sessão atual.
XACT_STATE indica se a sessão tem uma transação de usuário ativa e se a transação é capaz de 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.
Tipos de retorno
smallint
Comentários
XACT_STATE retorna os valores a seguir.
| Valor retornado | Description |
|---|---|
| 1 | A sessão atual tem uma transação de usuário ativa. A sessão pode executar qualquer ação, incluindo gravar dados e confirmar a transação. |
| 0 | Não há nenhuma transação de usuário ativa para a sessão atual. |
| -1 | A sessão atual tem uma transação de usuário ativa, mas ocorreu um erro que fez com que a transação fosse classificada como uma transação não compromissável. A sessão não pode confirmar a transação nem reverter para um ponto de salvamento; ele só pode solicitar uma reversão completa da transação. A sessão não pode executar nenhuma operação de gravação até reverter a transação. A sessão só pode executar operações de leitura até reverter a transação. Depois que a transação for revertida, a sessão poderá executar operações de leitura e gravação e pode iniciar uma nova transação. Quando o lote mais externo terminar de ser executado, o Mecanismo de Banco de Dados reverterá automaticamente todas as transações ativas não compromissáveis. Se nenhuma mensagem de erro tiver sido enviada quando a transação entrar em um estado não confirmável, quando o lote for concluído, 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 e @@TRANCOUNT as XACT_STATE funções podem ser usadas para detectar se a sessão atual tem uma transação de usuário ativa.
@@TRANCOUNT não pode ser usado para determinar se essa transação é classificada como uma transação não compromissável.
XACT_STATE não pode ser usado para determinar se há transações internas.
Exemplos
Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que você pode baixar na página inicial Microsoft SQL Server Samples and Community Projects.
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.
-- 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;