Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O que acontece com uma transação não confirmada quando a conexão é fechada?


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

  • Use SET 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.