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