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 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)