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

Reverter a transação interna da transação aninhada


O SQL Server realmente não oferece suporte a transações aninhadas. Há apenas uma transação por vez.

Esta transação tem um contador de transações aninhado básico, @@TRANCOUNT . Cada begin transaction consecutiva incrementa o contador em um, cada commit transaction reduz em um. Apenas o commit que reduz o contador para 0 realmente confirma a transação.

Uma rollback transaction desfaz uma transação e limpa @@TRANCOUNT .

No seu caso, o resultado engraçado é que SqlStatement3 é executado fora uma transação! Seu commit final lançará uma exceção "A solicitação COMMIT TRANSACTION não tem BEGIN TRANSACTION correspondente", mas os efeitos de SqlStatement3 são permanentes.

Por exemplo:
create table #t (col1 int)
insert #t (col1) values (1)
BEGIN TRANSACTION
update #t set col1 = 2 -- This gets rolled back
BEGIN TRANSACTION
update #t set col1 = 3 -- This gets rolled back too
ROLLBACK TRANSACTION
update #t set col1 = 4 -- This is run OUTSIDE a transaction!
COMMIT TRANSACTION -- Throws error
select col1 from #t

Imprime 4 . Sério. :)