Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

EF e TransactionScope para SQL Server e Oracle sem escalar/dimensionar para DTC?


Primeiro:nunca use var ts = new TransactionScope() . É o único forro que mata seu aplicativo. Sempre use o construtor explícito que permite especificar o nível de isolamento. Veja usando new TransactionScope() Considerado Nocivo.

Agora sobre sua pergunta:a lógica para não promover duas conexões no mesmo escopo no DTC depende muito do driver/provedores cooperando para informar ao System.Transactions que as duas conexões distintas são capazes de gerenciar a transação distribuída por conta própria porque os gerenciadores de recursos envolvidos são os mesmos. SqlClient post SQL Server 2008 é um driver capaz de fazer essa lógica. O driver Oracle que você usa não é (e não conheço nenhuma versão que seja, btw).

Em última análise, é realmente muito básico:se você não quer um DTC, não crie um! Certifique-se de usar exatamente uma conexão no escopo. É claramente discutível que você não precisa de duas conexões. Em outras palavras, livre-se dos dois repositórios separados em seu modelo de dados. Use apenas um repositório para Pedidos, Inventário e o que mais não. Você está dando um tiro no pé com eles e está pedindo soluções de pó mágico.

Atualização:driver Oracle 12c r1:

"Associação de transação e conexão:as conexões ODP.NET, por padrão, são desconectadas das transações somente quando os objetos de conexão são fechados ou os objetos de transação são descartados"