Quando uma transação é aberta no SQL Server, quais são as maneiras pelas quais ela pode ser revertida? No momento, estamos trabalhando com um aplicativo de terceiros que mostra com frequência transações abertas enquanto a consulta está em estado de suspensão, às vezes por dias (mostrando via sp_WhoIsActive). Isso me leva a acreditar que há um erro em algum lugar no aplicativo que não está permitindo que as transações sejam confirmadas. Quais são todas as maneiras pelas quais essas transações poderiam reverter?
- Tempo limite do lado do cliente (se especificado)
- O cliente fecha ou reinicia o aplicativo
- Eliminação manual do SPID
- Algo mais?
Devo fazer algo com transações que estão abertas há horas ou dias? Se eles vão reverter ou atingir o tempo limite em algum momento, há algum problema em encerrar o processo?
Para adicionar ao que @RLF forneceu em sua resposta; o seguinte também resultará na reversão da transação.
ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
reverterá quaisquer transações abertas.Desconexão pelo cliente, ou servidor, ou qualquer parte da infraestrutura intermediária.
Se o subsistema de disco subjacente desaparecer, todas as conexões abertas com o banco de dados serão encerradas. As transações não confirmadas serão revertidas quando o banco de dados for aberto posteriormente.
Se o servidor for desligado ou encerrado por qualquer motivo, as transações não confirmadas serão revertidas quando ele iniciar e abrir o banco de dados associado.
Se
SET XACT_ABORT ON
estiver definido, qualquer instrução T-SQL que gere um erro de tempo de execução fará com que uma transação aberta seja revertida.As transações com escopo em lote, aplicáveis a vários conjuntos de resultados ativos (MARS), que não foram confirmadas, serão revertidas quando um lote for concluído.
Para completar,
ROLLBACK TRANSACTION
irá, obviamente, reverter uma transação.Se o log de transações ficar cheio enquanto uma transação estiver aberta e o banco de dados for subsequentemente fechado por qualquer motivo, a reversão ocorrerá quando o banco de dados for colocado on-line novamente.
Se
SET IMPLICIT_TRANSACTIONS ON;
estiver definido, inclusive pelo padrão ANSI, as transações não confirmadas serão revertidas automaticamente quando o cliente se desconectar.Por que vale a pena,
SLEEPING
as conexões geralmente representam um Cliente que deixou uma conexão ativa, mas não está fazendo nada. Portanto, a conexão ésleeping
.Geralmente bastante inofensivo. Mas uma
SLEEPING
conexão que está segurando uma transação OPEN pode (mas não necessariamente) levar a problemas com outras transações ou com o log de transações.Adicione à sua lista de problemas: rede, roteamento e problemas semelhantes.