SQL Server和Oracle的EF和TransactionScope没有升级/跨越到DTC?

任何人都可以在这主题上更新我?

我想在我的应用程序中同时支持sql Server和Oracle.

是否可以使用以下代码(在BL中)同时适用于sql Server和Oracle而不升级/跨越到分布式事务(DTC)?

// dbcontext is created before,same dbcontext will be used by both repositories
 using (var ts = new TransactionScope())
 {
    // create order - make use of dbcontext,possibly to call SaveChanges here
    orderRepository.CreateOrder(order);

    // update inventory - make use of same dbcontext,possibly to call SaveChanges here
    inventoryRepository.UpdateInventory(inventory);

    ts.Complete();
 }

截至今天,2013年8月底,我了解它适用于sql Server 2008 ……但是Oracle呢?我发现这个thread ……看起来甲骨文正在推广分布式交易,但我仍然不清楚.

有没有人有编写应用程序的经验,以支持sql Server和Oracle与实体框架,以启发我?

谢谢!

更新:最后我注意到EF6附带了Improved Transaction Support.除了Remus的建议之外,这可能是我的解决方案.

解决方法

第一:永远不要使用var ts = new TransactionScope().是一个杀死你的应用程序的衬垫.始终使用允许您指定隔离级别的显式构造函数.见 using new TransactionScope() Considered Harmful.

现在谈谈你的问题:不将同一范围内的两个连接提升为DTC的逻辑很大程度上依赖于驱动程序/提供程序合作通知System.Transactions两个不同的连接能够自行管理分布式事务,因为涉及的资源管理者是一样的. sql Server 2008之后的sqlClient是一个能够执行此逻辑的驱动程序.你使用的Oracle驱动程序不是(我不知道任何版本,顺便说一句).

最终真的非常基本:如果你不想要DTC,不要创建一个!确保在范围中使用一个连接.很明显,你不需要两个连接.换句话说,摆脱数据模型中的两个单独的存储库.仅使用一个存储库来存储订单,库存以及其他什么不存在.你正在和他们一起射击自己,你要求的是小精灵粉尘解决方案.

更新:Oracle driver 12c r1

“Transaction and connection association: ODP.NET connections,by default,detach from transactions only when connection objects are closed or transaction objects are disposed”

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...