Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:Banco de Dados SQL do
Azure
Instância Gerenciada de SQL do Azure
Azure Synapse Analytics
Analytics Platform System (PDW)
Banco de Dados SQL no Microsoft Fabric
É uma função escalar que reporta o estado das transações do utilizador na sessão atual.
XACT_STATE indica se a sessão tem uma transação de utilizador ativa 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.
Tipos de devolução
smallint
Observações
XACT_STATE devolve os seguintes valores.
| Valor de retorno | Description |
|---|---|
| 1 | A sessão atual tem uma transação de utilizador ativa. A sessão pode realizar quaisquer ações, incluindo escrever dados e comprometer a transação. |
| 0 | Não há transação ativa de utilizador para a sessão atual. |
| -1 | A sessão 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. A sessão 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. A sessão não pode realizar nenhuma operação de escrita até reverter a transação. A sessão só pode realizar operações de leitura até reverter a transação. Depois de a transação ser revertida, a sessão pode realizar tanto operações de leitura como de escrita e pode 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 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 para o aplicativo cliente. Esta mensagem indica que uma transação não comprometível foi detetada e revertida. |
Ambas as XACT_STATE funções e @@TRANCOUNT podem ser usadas para detetar se a sessão atual tem uma transação de utilizador ativa.
@@TRANCOUNT não pode ser usado para determinar se essa transação é classificada como uma transação não comprometível.
XACT_STATE Não pode ser usado para determinar se existem transações internas.
Examples
Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que pode ser descarregado da página inicial de Exemplos e Projetos da Comunidade do Microsoft SQL Server.
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.
-- 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;