小编典典

用于SQL Server和Oracle的EF和TransactionScope是否无需升级/扩展为DTC?

sql

有人可以跟我更新这个话题吗?

我想在我的应用程序中同时支持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的Entity Framework的经验,从而启发了我?

谢谢!

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


阅读 185

收藏
2021-05-05

共1个答案

小编典典

第一:永远不要使用var ts = newTransactionScope()。是杀死您的应用程序的一线人。始终使用允许您指定隔离级别的显式构造函数。请参阅使用认为有害的新TransactionScope()

现在讨论您的问题:不将同一范围内的两个连接提升为DTC的逻辑在很大程度上取决于驱动程序/提供者之间的协作以通知系统。事务中两个不同的连接能够自行管理分布式事务,因为所涉及的资源管理器是相同的。SqlClient发布SQL
Server 2008是一种能够执行此逻辑的驱动程序。您使用的Oracle驱动程序不是(而且我不知道有哪个版本是btw)。

归根结底,这真的是非常基础的:如果您不需要DTC,请不要创建一个!确保在示波器中仅使用一个连接。很明显,您不需要两个连接。换句话说,摆脱数据模型中的两个单独的存储库。仅使用一个存储库来存储订单,库存以及其他内容。您正在与他们一起射击自己,而您正在寻求小精灵灰尘解决方案。

更新:Oracle驱动程序12cr1

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

2021-05-05