Ele pode permanecer aberto enquanto o pool de conexões se aplica. Exemplo:comando timeout pode deixar travas e TXN porque o cliente envia como "abort".
2 soluções:
-
Teste no cliente, literalmente:
IF @@TRANCOUNT <> 0 ROLLBACK TRAN
-
UseSET XACT_ABORT ON
para garantir que um TXN seja limpo:Pergunta 1 e Pergunta 2
Eu sempre uso
SET XACT_ABORT ON
. A partir deste blog da equipe SQL:
Observe que, com o pool de conexões, simplesmente fechar a conexão sem um rollback só retornará a conexão ao pool e a transação permanecerá aberta até ser reutilizada ou removida do pool. Isso pode resultar em bloqueios iniciados desnecessários e causar outros tempos limite e bloqueio contínuo
Do MSDN, seção "Suporte a transações" (meu negrito)
Quando uma conexão é fechada, ela é liberada de volta ao pool e à subdivisão apropriada com base em seu contexto de transação. Portanto, você pode fechar a conexão sem gerar um erro, mesmo que uma transação distribuída ainda esteja pendente. Isso permite que você confirme ou aborte a transação distribuída posteriormente.