Først og fremmest er der ikke sådan noget som en indlejret transaktion i SQL Server . Dette er vigtigt.
For det andet bruger begge TransactionScopes conn1, så du (på SQL Server-niveau) øger @@TRANCOUNT
for hver BEGIN TRANSACTION
Simpel forklaring:den indre transaktion er forpligtet, når den ydre transaktion forpligtes, fordi tilbagerulning af den indre ville tilbageføre begge transaktioner
Det vil sige COMMIT TRANSACTION
(antydet af .Complete
og .Dispose
) nedsætter @@TRANCOUNT
mens ROLLBACK TRANSACTION
(underforstået af .Dispose
kun) tager det tilbage til nul. Så den indre rollback er undertrykt på grund af "ikke sådan noget som indlejrede transaktioner"
Hvis du havde brugt conn2 korrekt i det indre 'scope, ville det fungere som forventet, fordi de 2 transaktioner ikke er relaterede på databaseserverniveauet. Det er der, det betyder noget...