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

Perché una transazione nidificata viene salvata anche se TransactionScope.Complete() non viene mai chiamato?

Prima di tutto, c'è nessuna transazione nidificata in SQL Server . Questo è importante.

In secondo luogo, entrambi TransactionScope utilizzano conn1 quindi (a livello di SQL Server) si sta incrementando @@TRANCOUNT per ogni BEGIN TRANSACTION

Spiegazione semplice:viene eseguito il commit della transazione interna quando viene eseguito il commit della transazione esterna perché il rollback di quella interna verrebbe ripristinato entrambi transazioni

Cioè, COMMIT TRANSACTION (implicito da .Complete e .Dispose ) decrementa @@TRANCOUNT mentre ROLLBACK TRANSACTION (implicito da .Dispose solo) lo riporta a zero. Quindi il rollback interno viene soppresso a causa di "nessuna cosa come le transazioni nidificate"

Se avessi usato correttamente conn2 nell'ambito interno, funzionerebbe come previsto perché le 2 transazioni non sono correlate a livello di server di database. Che è dove conta...