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...