加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL Server和Oracle的EF和TransactionScope没有升级/跨越到DTC?

发布时间:2021-02-01 23:30:31 所属栏目:MsSql教程 来源:网络整理
导读:任何人都可以在这个主题上更新我? 我想在我的应用程序中同时支持SQL Server和Oracle. 是否可以使用以下代码(在BL中)同时适用于SQL Server和Oracle而不升级/跨越到分布式事务(DTC)? // dbcontext is created before,same dbcontext will be used by both

任何人都可以在这个主题上更新我?

我想在我的应用程序中同时支持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 ……看起来甲骨文正在推广分布式交易,但我仍然不清楚.

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

谢谢!

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

解决方法

第一:永远不要使用var ts = new TransactionScope().是一个杀死你的应用程序的衬垫.始终使用允许您指定隔离级别的显式构造函数.见 using new TransactionScope() Considered Harmful.

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

最终真的非常基本:如果你不想要DTC,不要创建一个!确保在范围中使用一个连接.很明显,你不需要两个连接.换句话说,摆脱数据模型中的两个单独的存储库.仅使用一个存储库来存储订单,库存以及其他什么不存在.你正在和他们一起射击自己,你要求的是小精灵粉尘解决方案.

更新:Oracle driver 12c r1:

“Transaction and connection association: ODP.NET connections,by default,detach from transactions only when connection objects are closed or transaction objects are disposed”

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读