有人可以跟我更新这个话题吗?
我想在我的应用程序中同时支持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的建议外,这可能是我的解决方案。
第一:永远不要使用var ts = newTransactionScope()。是杀死您的应用程序的一线人。始终使用允许您指定隔离级别的显式构造函数。请参阅使用认为有害的新TransactionScope()。
var ts = newTransactionScope()
现在讨论您的问题:不将同一范围内的两个连接提升为DTC的逻辑在很大程度上取决于驱动程序/提供者之间的协作以通知系统。事务中两个不同的连接能够自行管理分布式事务,因为所涉及的资源管理器是相同的。SqlClient发布SQL Server 2008是一种能够执行此逻辑的驱动程序。您使用的Oracle驱动程序不是(而且我不知道有哪个版本是btw)。
归根结底,这真的是非常基础的:如果您不需要DTC,请不要创建一个!确保在示波器中仅使用一个连接。很明显,您不需要两个连接。换句话说,摆脱数据模型中的两个单独的存储库。仅使用一个存储库来存储订单,库存以及其他内容。您正在与他们一起射击自己,而您正在寻求小精灵灰尘解决方案。
更新:Oracle驱动程序12cr1:
“事务和连接关联:默认情况下,ODP.NET连接仅在关闭连接对象或释放事务对象时才与事务分离”