sql >> Base de Datos >  >> RDS >> Sqlserver

Revertir la transacción interna de la transacción anidada

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