SQL Server ve skutečnosti nepodporuje vnořené transakce. V jednu chvíli existuje pouze jedna transakce.
Tato jedna transakce má základní vnořené počítadlo transakcí @@TRANCOUNT
. Každý po sobě jdoucí begin transaction
zvýší počítadlo o jeden, každý commit transaction
sníží o jednu. Pouze commit
který sníží počítadlo na 0, skutečně potvrdí jednu transakci.
rollback transaction
zruší jednu transakci a vymaže @@TRANCOUNT
.
Ve vašem případě je vtipným výsledkem, že SqlStatement3 je spuštěn venku transakce! Váš poslední commit
vyvolá "Požadavek COMMIT TRANSACTION nemá žádnou odpovídající výjimku BEGIN TRANSACTION", ale účinky SqlStatement3 jsou trvalé.
Například:
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
Vytiskne 4
. Opravdu. :)