sql >> Databasteknik >  >> RDS >> Sqlserver

Varför begås en kapslad transaktion även om TransactionScope.Complete() aldrig anropas?

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



  1. Letar du efter en enkel fulltextsökning? Prova MySQL InnoDB + CakePHP med Word Stemming

  2. Röstsystem som använder PHP+MySql?

  3. Vad är skillnaden mellan C och Posix lokaler på Postgres?

  4. Importera text till MySQL:konstigt format