SQL Server realmente no admite transacciones anidadas. Solo hay una transacción a la vez.
Esta transacción tiene un contador de transacciones anidado básico, @@TRANCOUNT
. Cada begin transaction
consecutiva incrementa el contador en uno, cada commit transaction
lo reduce en uno. Solo el commit
que reduce el contador a 0 realmente compromete la transacción.
Una rollback transaction
deshace la transacción y borra @@TRANCOUNT
.
En su caso, el resultado divertido es que SqlStatement3 se ejecuta fuera una transacción! Su commit
final arrojará una excepción "La solicitud COMMIT TRANSACTION no tiene BEGIN TRANSACTION correspondiente", pero los efectos de SqlStatement3 son permanentes.
Por ejemplo:
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
Imprime 4
. En realidad. :)