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

¿Por qué se confirma una transacción anidada incluso si TransactionScope.Complete() nunca se llama?

En primer lugar, hay no existen transacciones anidadas en SQL Server . Esto es importante.

En segundo lugar, ambos TransactionScopes usan conn1, por lo que está (en el nivel de SQL Server) incrementando @@TRANCOUNT para cada BEGIN TRANSACTION

Explicación simple:la transacción interna se confirma cuando se confirma la transacción externa porque revertir la interna revertiría ambos transacciones

Es decir, COMMIT TRANSACTION (Implicado por .Complete y .Dispose ) decrementa @@TRANCOUNT while ROLLBACK TRANSACTION (implicado por .Dispose solamente) lo devuelve a cero. Por lo tanto, la reversión interna se suprime debido a que "no existen transacciones anidadas"

Si hubiera usado conn2 correctamente en el ámbito interno, funcionaría como se esperaba porque las 2 transacciones no están relacionadas en el nivel del servidor de la base de datos. Que es donde importa...