SQL Server ondersteunt niet echt geneste transacties. Er is slechts één transactie tegelijk.
Deze ene transactie heeft een basis geneste transactieteller, @@TRANCOUNT
. Elke opeenvolgende begin transaction
verhoogt de teller met één, elke commit transaction
vermindert het met één. Alleen de commit
dat de teller terugbrengt naar 0, begaat echt die ene transactie.
Een rollback transaction
maakt de ene transactie ongedaan en wist @@TRANCOUNT
.
In jouw geval is het grappige resultaat dat SqlStatement3 buiten wordt uitgevoerd een transactie! Je laatste commit
zal een "Het COMMIT TRANSACTION-verzoek heeft geen corresponderende BEGIN TRANSACTION"-uitzondering genereren, maar de effecten van SqlStatement3 zijn permanent.
Bijvoorbeeld:
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
Drukt 4
af . Werkelijk. :)