SQL Server stöder egentligen inte kapslade transaktioner. Det finns bara en transaktion åt gången.
Den här transaktionen har en grundläggande kapslad transaktionsräknare, @@TRANCOUNT
. Varje på varandra följande begin transaction
ökar räknaren med en, varje commit transaction
minskar den med en. Endast commit
som minskar räknaren till 0 begår verkligen den ena transaktionen.
En rollback transaction
ångrar den ena transaktionen och rensar @@TRANCOUNT
.
I ditt fall är det roliga resultatet att SqlStatement3 körs utanför en transaktion! Ditt sista commit
kommer att kasta ett "BEGÖRELSE TRANSAKTION begäran har inget motsvarande BEGIN TRANSACTION" undantag, men effekterna av SqlStatement3 är permanenta.
Till exempel:
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
Skriver ut 4
. Verkligen. :)