Först och främst finns det inget sådant som en kapslad transaktion i SQL Server . Detta är viktigt.
För det andra använder båda TransactionScopes conn1 så att du (på SQL Server-nivå) ökar @@TRANCOUNT
för varje BEGIN TRANSACTION
Enkel förklaring:den inre transaktionen genomförs när den yttre transaktionen genomförs eftersom en återställning av den inre skulle återställa båda transaktioner
Det vill säga COMMIT TRANSACTION
(underförstått av .Complete
och .Dispose
) minskar @@TRANCOUNT
medan ROLLBACK TRANSACTION
(underförstått av .Dispose
endast) tar det tillbaka till noll. Så den inre återställningen undertrycks på grund av "ingen sådan sak som kapslade transaktioner"
Om du hade använt conn2 korrekt i det inre omfånget skulle det fungera som förväntat eftersom de två transaktionerna inte är relaterade på databasservernivån. Det är där det spelar roll...