Oracle
 sql >> Database >  >> RDS >> Oracle

EF e TransactionScope sia per SQL Server che Oracle senza escalation/spanning a DTC?

Primo:non usare mai var ts = new TransactionScope() . È l'unico liner che uccide la tua app. Utilizzare sempre il costruttore esplicito che consente di specificare il livello di isolamento. Vedere l'utilizzo del nuovo TransactionScope() considerato dannoso.

Ora riguardo alla tua domanda:la logica per non promuovere due connessioni nello stesso ambito in DTC si basa fortemente sul driver/fornitori che cooperano per informare il System.Transactions che le due connessioni distinte sono in grado di gestire la transazione distribuita bene da sole perché i gestori delle risorse coinvolti sono gli stessi. SqlClient dopo SQL Server 2008 è un driver in grado di eseguire questa logica. Il driver Oracle che usi non lo è (e non sono a conoscenza di alcuna versione che sia, a proposito).

In definitiva è davvero davvero molto basilare:se non vuoi un DTC, non crearne uno! Assicurati di utilizzare esattamente una connessione nell'ambito. È chiaramente discutibile che non sono necessarie due connessioni. In altre parole, elimina i due repository separati nel tuo modello di dati. Usa un solo repository per Ordini, Inventario e cos'altro cosa no. Ti stai sparando ai piedi con loro e stai chiedendo soluzioni per la polvere di folletto.

Aggiornamento:driver Oracle 12c r1:

"Associazione di transazioni e connessioni:le connessioni ODP.NET, per impostazione predefinita, si staccano dalle transazioni solo quando gli oggetti connessione vengono chiusi o gli oggetti transazione vengono eliminati"