entityframework与transactionscope事务和并发控制.docxVIP

entityframework与transactionscope事务和并发控制.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
EntityFramework 与 TransactionScope 事务和并发控制 EntityFramework 与 TransactionScope 事务和并发控制 最近在园子里看到一篇关于 TransactionScope 的文章,发现 事务和并发控制是新接触 Entity Framework 和 Transaction Scope的园友们不易理解的问题,遂组织此文跟大家共同探 讨。 首先事务的 ACID 特性作为最基础的知识我想大家都应该知 道了。 ADO.NET 的 SQLTransaction 就是 .NET 框架下访问 SqlServer 时最底层的数据库事务对象, 它可以用来将多次的 数据库访问封装为“原子操作” ,也可以通过修改隔离级别 来控制并发时的行为。 TransactionScope 则是为了在分布式数 据节点上完成事务的工具,它经常被用在业务逻辑层将多个 数据库操作组织成业务事务的场景,可以做到透明的可分布 式事务控制和隐式失败回滚。但与此同时也经常有人提到 TransactionScope 有性能和部署方面的问题, 关于这一点, 根 据 MSDN 的 Using the TransactionScope Class 的说法,当一 个 TransactionScope 包含的操作是同一个数据库连接时,它 的行为与 SqlTransaction 是类似的。当它在多个数据库连接 上进行数据操作时,则会将本地数据库事务提升为分布式事 务,而这种提升要求各个节点均安装并启动 DTC 服务来支 持分布式事务的协调工作,它的性能与本地数据库事务相比 会低很多,这也是 CAP 定律说的分布式系统的 Consistency 和 Availability 不可兼得的典型例子。 所以当我们选择是否使 用 TransactionScope 时,一定要确认它会不会导致不想发生 的分布式事务,也应该确保事务尽快做完它该做的事情,为 了确认事务是否被提升我们可以用 SQL Profiler 去跟踪相关 的事件。 然后再来看一看 Entity Framework ,其实 EF 也跟事务有关系。 它的 Context 概念来源于 Unit of Work 模式, Context 记录提 交前的所有 Entity 变化,并在 SaveChanges 方法调用时发起 真正的数据库操作, SaveChanges 方法在默认情况下隐含一 个事务,并且试图使用乐观并发控制来提交数据,但是为了 进行并发控制我们需要将 Entity Property 的 ConcurrencyMode 设置为 Fixed 才行,否则 EF 不理会在此 Entity 上面发生的并发修改,这一点可以参考 MSDN Saving Changes and Managing Concurrency。微软推荐大家使用以下 方法来捕获冲突的并发操作,并使用 RefreshMode 来选择覆 盖或丢弃失败的操作: try { // Try to save changes, which may cause a conflict. 10Console.WriteLine(No conflicts. +num.ToString() + updates saved.);catch (OptimisticConcurrencyException)// Resolve the concurrency conflict byrefreshing the11// object context before re-saving changes.12context.Refresh(RefreshMode.ClientWins,orders); 10 Console.WriteLine(No conflicts. + num.ToString() + updates saved.); catch (OptimisticConcurrencyException) // Resolve the concurrency conflict by refreshing the 11 // object context before re-saving changes. 12 context.Refresh(RefreshMode.ClientWins, orders); 13 14 // Save changes. 15 context.SaveChanges(); 16 17Console.WriteLine(OptimisticConcurrencyException 17 + handled and changes saved); 18 当然除了乐观并发控制我们还可以对冲突特别频繁、冲突解

文档评论(0)

2105194781 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档