Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Setzen Sie die innere Transaktion einer verschachtelten Transaktion zurück

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. :)