Ten eerste is er niet zoiets als een geneste transactie in SQL Server . Dit is belangrijk.
Ten tweede gebruiken beide TransactionScopes conn1 zodat u (op SQL Server-niveau) @@TRANCOUNT
verhoogt voor elke BEGIN TRANSACTION
Simpele uitleg:de innerlijke transactie wordt gepleegd wanneer de buitenste transactie wordt gepleegd, omdat het terugdraaien van de binnenste beide zou terugdraaien transacties
Dat wil zeggen, COMMIT TRANSACTION
(geïmpliceerd door .Complete
en .Dispose
) verlaagt @@TRANCOUNT
terwijl ROLLBACK TRANSACTION
(geïmpliceerd door .Dispose
alleen) brengt het terug naar nul. Dus de innerlijke terugdraaiing wordt onderdrukt vanwege "niet zoiets als geneste transacties"
Als u conn2 correct in de binnenste 'scope had gebruikt, zou het werken zoals verwacht, omdat de 2 transacties op databaseserverniveau geen verband houden. Waar het om gaat...