SQL Server tak naprawdę nie obsługuje transakcji zagnieżdżonych. Jest tylko jedna transakcja na raz.
Ta jedna transakcja ma podstawowy licznik transakcji zagnieżdżonych, @@TRANCOUNT
. Każda kolejna begin transaction
zwiększa licznik o jeden, każda commit transaction
zmniejsza go o jeden. Tylko commit
która zmniejsza licznik do 0, naprawdę zatwierdza jedną transakcję.
rollback transaction
cofa jedną transakcję i usuwa @@TRANCOUNT
.
W twoim przypadku zabawnym wynikiem jest to, że SqlStatement3 jest uruchamiany na zewnątrz transakcja! Twoje ostateczne commit
zgłosi wyjątek „Żądanie COMMIT TRANSACTION nie ma odpowiadającego mu wyjątku BEGIN TRANSACTION”, ale efekty SqlStatement3 są trwałe.
Na przykład:
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
Drukuje 4
. Naprawdę. :)