【问题标题】:EF and TransactionScope for both SQL Server and Oracle without escalating/spanning to DTC?SQL Server 和 Oracle 的 EF 和 TransactionScope 没有升级/跨越到 DTC?
【发布时间】:2013-08-28 13:26:27
【问题描述】:

谁能更新我这个话题?

我想在我的应用程序中同时支持 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... 看起来 Oracle 正在推广分布式事务,但我仍然不清楚。

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

谢谢!

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

【问题讨论】:

  • 或者至少,也许有人告诉我另一个 ORM/Oracle 数据提供者可以用来实现我的目标?

标签: sql oracle entity-framework transactions transactionscope


【解决方案1】:

首先:永远不要使用var ts = new TransactionScope()。是杀死你的应用程序的一个班轮。始终使用可让您指定隔离级别的显式构造函数。见using new TransactionScope() Considered Harmful

现在关于您的问题:不将同一范围内的两个连接提升到 DTC 的逻辑在很大程度上依赖于驱动程序/提供者合作以通知 System.Transactions 这两个不同的连接能够很好地管理分布式事务他们自己的,因为所涉及的资源管理器是相同的。 SqlClient post SQL Server 2008 是一个能够执行此逻辑的驱动程序。您使用的 Oracle 驱动程序不是(而且我不知道任何版本,顺便说一句)。

最终真的非常非常基本:如果您不想要 DTC,就不要创建 DTC!确保您在范围内只使用一个连接。显然,您不需要两个连接。换句话说,摆脱数据模型中的两个独立存储库。仅使用一个存储库来存储订单、库存以及其他什么不可用的存储库。你是在和他们打自己的脚,你在寻求精灵粉解决方案。

更新:Oracle driver 12c r1

“事务和连接关联:ODP.NET 连接默认只有在连接对象关闭或事务对象被释放时才从事务中分离”

【讨论】:

  • 嗨 Remus...我很高兴你能来,你很久以前也帮助过我。我已经对这些东西发疯了......所以甲骨文可能无法解决这个问题。但后来我真的不确定我如何才能让我的 BL 看起来像实现我的目标。你介意给我 5 分钟的时间聊天吗?
  • 我有一个项目有自己的业务对象(在 BL 中使用)和 EF 有自己的 POCO。我想插入多个相关的业务对象,但我必须在一个事务中多次调用“SaveChanges”,以便稍后插入具有外键自动生成先前插入对象的 ID 的对象。多次调用 SaveChanges 我认为 Oracle 会升级,是吗? (注意:我不能使用导航属性,因为我在 BL 中没有 POCO)
  • AFAIK 多次调用 .SaveChanges 应该不是问题。问题源于您使用两个不同的 EF 上下文:orderRepositoryinventoryRepository
  • 啊,不,dbContext 是一样的...您能否重新检查我的问题中的线程链接?他们在那里说同样的话,这让我感到惊讶......但也许我理解错了?
  • 另一种情况是,当我想结合其他一些 dbContext.SaveChanges 在事务范围内执行存储过程时。这也是我不明白它是否在 Oracle 中升级的东西。
【解决方案2】:

不,分布式事务需要 DTC - 像这样跨越 2 种不同数据库技术的东西就是分布式事务。对不起!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2011-10-05
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2012-09-06
    • 2010-12-18
    相关资源
    最近更新 更多