sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor begås en indlejret transaktion, selvom TransactionScope.Complete() aldrig kaldes?

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



  1. Tilslutning af Microsoft Excel til Xero

  2. PHP - funktion til mysql_fetch_assoc

  3. Bevar og vis tekst nøjagtigt, som den er skrevet og indsendt

  4. Lagring af følsomme data sikkert i en database