Po pierwsze, istnieje nie ma czegoś takiego jak zagnieżdżona transakcja w SQL Server . To ważne.
Po drugie, oba TransactionScopes używają conn1, więc (na poziomie SQL Server) zwiększasz @@TRANCOUNT dla każdej BEGIN TRANSACTION
Proste wyjaśnienie:transakcja wewnętrzna zostaje zatwierdzona, gdy transakcja zewnętrzna zostanie zatwierdzona, ponieważ wycofanie wewnętrznej spowodowałoby wycofanie obie transakcje
Oznacza to, że COMMIT TRANSACTION (implikowane przez .Complete i .Dispose ) zmniejsza @@TRANCOUNT while ROLLBACK TRANSACTION (implikowane przez .Dispose tylko) cofa go do zera. Tak więc wewnętrzne wycofanie jest pomijane, ponieważ „nie ma czegoś takiego jak transakcje zagnieżdżone”
Jeśli poprawnie użyłeś conn2 w wewnętrznym zakresie, działałoby to zgodnie z oczekiwaniami, ponieważ 2 transakcje nie są powiązane na poziomie serwera bazy danych. I właśnie to ma znaczenie...