SQL Server unterstützt verschachtelte Transaktionen nicht wirklich. Es gibt immer nur eine Transaktion.
Diese eine Transaktion hat einen einfachen verschachtelten Transaktionszähler, @@TRANCOUNT
. Jede aufeinanderfolgende begin transaction
erhöht den Zähler bei jeder commit transaction
um eins reduziert es um eins. Nur das commit
das den Zähler auf 0 reduziert, schreibt wirklich die eine Transaktion fest.
Eine rollback transaction
macht die eine Transaktion rückgängig und löscht @@TRANCOUNT
.
In Ihrem Fall ist das lustige Ergebnis, dass SqlStatement3 außerhalb ausgeführt wird eine Transaktion! Ihr letztes commit
wird die Ausnahme "Die Anfrage COMMIT TRANSACTION hat keine entsprechende BEGIN TRANSACTION"-Ausnahme auslösen, aber die Auswirkungen von SqlStatement3 sind dauerhaft.
Zum Beispiel:
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
Druckt 4
. Wirklich. :)