sql >> Database >  >> RDS >> Oracle

EF en TransactionScope voor zowel SQL Server als Oracle zonder te escaleren/overspannen naar DTC?

Ten eerste:gebruik nooit var ts = new TransactionScope() . Is de enige voering die je app doodt. Gebruik altijd de expliciete constructor waarmee u het isolatieniveau kunt opgeven. Zie het gebruik van nieuwe TransactionScope() als schadelijk beschouwd.

Nu over uw vraag:de logica om twee verbindingen in hetzelfde bereik niet in DTC te promoten, is sterk afhankelijk van de bestuurder/providers die samenwerken om het systeem te informeren. Transacties dat de twee verschillende verbindingen in staat zijn om de gedistribueerde transactie op zichzelf prima te beheren, omdat de betrokken resourcemanagers zijn hetzelfde. SqlClient na SQL Server 2008 is een stuurprogramma dat deze logica kan uitvoeren. Het Oracle-stuurprogramma dat u gebruikt, is dat niet (en ik ben niet op de hoogte van een versie die dat wel is, btw).

Uiteindelijk is het echt heel erg basic:als je geen DTC wilt, maak er dan geen! Zorg ervoor dat u precies één aansluiting in de scope gebruikt. Het is duidelijk dat je geen twee aansluitingen nodig hebt. Met andere woorden, verwijder de twee afzonderlijke opslagplaatsen in uw gegevensmodel. Gebruik slechts één repository voor bestellingen, inventaris en wat nog meer. Je schiet jezelf daarmee in de voet en je vraagt ​​om pixie dust-oplossingen.

Update:Oracle-stuurprogramma 12c r1:

"Transactie en verbindingsassociatie:ODP.NET-verbindingen worden standaard alleen losgekoppeld van transacties wanneer verbindingsobjecten worden gesloten of transactieobjecten worden verwijderd"



  1. Impact van uitvoeringsplan op ASYNC_NETWORK_IO Wachten - Deel 1

  2. Draaitabellen in MySQL

  3. Negeert MySQL null-waarden op unieke beperkingen?

  4. bewerking niet toegestaan ​​wanneer het object is gesloten bij het uitvoeren van een meer geavanceerde query