Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que uma transação aninhada é confirmada mesmo que TransactionScope.Complete() nunca seja chamada?


Primeiro, há não existe uma transação aninhada no SQL Server . Isso é importante.

Em segundo lugar, ambos os TransactionScopes usam conn1 para que você esteja (no nível do SQL Server) incrementando @@TRANCOUNT para cada BEGIN TRANSACTION

Explicação simples:a transação interna é confirmada quando a transação externa é confirmada porque a reversão da transação interna reverteria ambos transações

Ou seja, COMMIT TRANSACTION (implicado por .Complete e .Dispose ) diminui @@TRANCOUNT enquanto ROLLBACK TRANSACTION (implicado por .Dispose apenas) leva de volta a zero. Portanto, a reversão interna é suprimida devido a "não haver transações aninhadas"

Se você tivesse usado conn2 corretamente no escopo interno, funcionaria conforme o esperado porque as 2 transações não estão relacionadas no nível do servidor de banco de dados. Que é onde importa...