代码之家  ›  专栏  ›  技术社区  ›  Learner

用于SQL Server和Oracle的EF和TransactionScope,而不升级/跨越到DTC?

  •  2
  • Learner  · 技术社区  · 12 年前

    有人能向我介绍这个话题的最新情况吗?

    我希望在我的应用程序中同时支持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+。。。但甲骨文呢?我发现了这个 thread …看起来Oracle正在向分布式事务推广,但我仍然不清楚。

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

    谢谢

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

    2 回复  |  直到 12 年前
        1
  •  1
  •   Remus Rusanu    12 年前

    第一:永远不要使用 var ts = new TransactionScope() 。是杀死你的应用程序的一句话。请始终使用显式构造函数来指定隔离级别。看见 using new TransactionScope() Considered Harmful .

    现在谈谈你的问题:不将同一范围内的两个连接提升到DTC的逻辑在很大程度上依赖于驱动程序/提供商的合作来通知系统。两个不同连接能够单独管理分布式事务的事务,因为所涉及的资源管理器是相同的。SQL Server 2008之后的SqlClient是一个能够执行此逻辑的驱动程序。您使用的Oracle驱动程序不是(顺便说一句,我不知道有哪个版本是)。

    最终是非常非常基本的:如果你不想要DTC,就不要创建!请确保在作用域中只使用一个连接。你不需要两个连接,这显然是有争议的。换句话说,在数据模型中去掉两个独立的存储库。只使用一个存储库来存储订单、库存和其他不需要的内容。你在用它们射自己的脚,你在要求精灵粉尘解决方案。

    更新: Oracle driver 12c r1 :

    “事务和连接关联:默认情况下,只有在关闭连接对象或处理事务对象时,ODP.NET连接才会与事务分离”

        2
  •  1
  •   Kieren Johnstone    12 年前

    不,分布式事务需要DTC,而像这样跨越两种不同数据库技术的东西就是分布式事务。很抱歉