2

谁能更新我这个话题?

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

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

谢谢!

更新:最后我注意到 EF6 带有改进的事务支持。除了 Remus 的建议之外,这可能是我的解决方案。

4

2 回答 2

1

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

于 2013-08-29T12:44:48.370 回答
1

第一:永远不要使用var ts = new TransactionScope(). 是杀死你的应用程序的一个班轮。始终使用可让您指定隔离级别的显式构造函数。请参阅使用新的 TransactionScope() 被认为是有害的。

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

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

更新:Oracle 驱动程序 12c r1

“事务和连接关联:ODP.NET 连接,默认情况下,仅在关闭连接对象或处置事务对象时才从事务中分离”

于 2013-08-29T13:10:06.830 回答