sql >> Database >  >> RDS >> Sqlserver

Waarom wordt een geneste transactie vastgelegd, zelfs als TransactionScope.Complete() nooit wordt aangeroepen?

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



  1. Verbind PDO met Oracle-database

  2. Overschakelen van MySQL naar Cassandra - voor- en nadelen?

  3. Equivalent van de functie FOUND_ROWS() in Postgresql

  4. MySQL invoegen indien voorwaarde