Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi une transaction imbriquée est-elle validée même si TransactionScope.Complete() n'est jamais appelée ?

Tout d'abord, il y a aucune transaction imbriquée dans SQL Server . C'est important.

Deuxièmement, les deux TransactionScopes utilisent conn1, donc vous (au niveau SQL Server) incrémentez @@TRANCOUNT pour chaque BEGIN TRANSACTION

Explication simple :la transaction interne est validée lorsque la transaction externe est validée, car l'annulation de l'intérieur annulerait les deux opérations

Autrement dit, COMMIT TRANSACTION (sous-entendu par .Complete et .Dispose ) décrémente @@TRANCOUNT tandis que ROLLBACK TRANSACTION (sous-entendu par .Dispose seulement) le ramène à zéro. Ainsi, la restauration interne est supprimée car "aucune telle chose que les transactions imbriquées"

Si vous aviez utilisé conn2 correctement dans la portée interne, cela fonctionnerait comme prévu car les 2 transactions ne sont pas liées au niveau du serveur de base de données. C'est là que ça compte...