Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Eseguire il rollback della transazione interna della transazione nidificata

SQL Server non supporta realmente le transazioni nidificate. C'è solo una transazione alla volta.

Questa transazione ha un contatore di transazioni annidato di base, @@TRANCOUNT . Ogni begin transaction consecutiva incrementa il contatore di uno, ogni commit transaction lo riduce di uno. Solo il commit che riduce il contatore a 0 commette davvero l'unica transazione.

Una rollback transaction annulla l'unica transazione e cancella @@TRANCOUNT .

Nel tuo caso, il risultato divertente è che SqlStatement3 viene eseguito fuori una transazione! Il tuo commit finale genererà un'eccezione "La richiesta COMMIT TRANSACTION non ha una corrispondente BEGIN TRANSACTION", ma gli effetti di SqlStatement3 sono permanenti.

Ad esempio:

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

Stampa 4 . Veramente. :)