回到目录

对于transactionscope不了解的同学,可以看我的相关文章

第二十六回   将不确定变为确定~transactionscope何时提升为分布式事务?

第二十七回   将不确定变为确定~transactionscope何时提升为分布式事务~续

第二十八回   将不确定变为确定~transactionscope何时提升为分布式事务~再续(避免引起不必要的MSDTC)

第二十九回   将不确定变为确定~transactionscope何时提升为分布式事务~大结局

第三十七回   将不确定变为确定~transactionscope何时提升为分布式事务~SQL2005与SQL2008不同

声明:

对于这种事务,如果希望程序出错自动回滚,必须将异常throw出来,不能愉愉的用日志记录!

测试:

对于sql2008已经很好的支持了transactionscope,而对于sql2005来说,支持的不是很好,它将多个savechanges()方法提升为分布式事务msdtc,它不管你是否为一个数据库,真是无奈了!还好,最好找到了解决方法,下面图所示,将多个insert,update包裹到一个transactionscope里,所产生的结果如下:

简单来说,就是sp_reset_connection重新使用一次SQL链接时,你的事务里的代码是被包裹在一起发送过来的,这时,如果有一条SQL语句出现异常,整个包会发生callback!

上面图中,只要有一条语句出现SQL异常,都会发生回滚,从而保证了数据的完整性。

当然,我们的计算机中,并没有开启msdtc服务,有图有真像

前提:Db数据上下文对象必须与action指向的方法体里的上下文是同一个。

相关原始代码为:

    var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)Db).ObjectContext;try{objectContext.Connection.Open();using (TransactionScope trans = new TransactionScope()){insert1();insert2();}}catch (Exception){throw;}finally{objectContext.Connection.Close();}

OK,我们将上面代码进行一个封装,让它访问起来更方便一些,看代码:

 /// <summary>/// Author:zhang.zhanling/// 对TransactionScope,让它对同一个数据库不产生msdtc服务/// </summary>public class TransactionScopeNoMsdtc{/// <summary>/// 产生包裹事务/// </summary>/// <param name="db">数据上下文</param>/// <param name="isOutermost">是否为最外层,默认为false</param>/// <param name="action">处理代码块</param>public static void UsingNoMsdtc(DbContext db, bool isOutermost, Action action){var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)db).ObjectContext;try{if (objectContext.Connection.State == System.Data.ConnectionState.Closed)objectContext.Connection.Open();using (TransactionScope trans = new TransactionScope()){action();trans.Complete();}}finally{if (isOutermost)//如果是最外层事务,而将连接关闭
                    objectContext.Connection.Close();}}/// <summary>/// 产生包裹事务,它不是最外层的,如果是最外层的需要调用其它重载/// </summary>/// <param name="db"></param>/// <param name="action"></param>public static void UsingNoMsdtc(DbContext db, Action action){UsingNoMsdtc(db, false, action);}}

在使用时,我们可以这样来做,不用TransactionScope,而是用TransactionScopeNoMsdtc呵呵。

   EntityFrameworks.Data.Core.TransactionScopeNoMsdtc.UsingNoMsdtc(Db, () =>{insert1();insert2();});

感谢阅读!

回到目录

将不确定变为确定~transactionscope何时提升为分布式事务?(sql2005数据库解决提升到MSDTC的办法)...相关推荐

  1. 将不确定变为确定~transactionscope何时提升为分布式事务?

    相关文章 将不确定变为确定~transactionscope何时提升为分布式事务 将不确定变为确定~transactionscope何时提升为分布式事务~续 将不确定变为确定~transactions ...

  2. TransactionScope和分布式事务的注意点

    分布式事务听起来很不错,其实不然.它只是尽可能的降低数据不一致的可能性,并不能完全避免.从我的应用中来看,总数约5千万的操作,错了十几个.当然,这个错误率完全可以忍受了.不能忍受的是当你的DB在clu ...

  3. 搞懂分布式技术30:高并发解决方案——提升高并发量服务器性能解决思路

    高并发解决方案--提升高并发量服务器性能解决思路 一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很 ...

  4. C#分布式事务(TransactionScope )

    TransactionScope是.Net Framework 2.0后,新增了一个名称空间.它的用途是为数据库访问提供了一个"轻量级"[区别于:SqlTransaction]的事 ...

  5. Java提升篇-事务隔离级别和传播机制

    转载自 Java提升篇-事务隔离级别和传播机制 问题的提出 为了保证并发操作数据的正确性及一致性,SQL规范于1992年提出了数据库事务隔离级别. 事务隔离级别分类 事务隔离级别由低往高可分为以下几类 ...

  6. 【转】C#中使用TransactionScope类(分布式事务) 和 锁

    如果在C#中使用TransactionScope类(分布式事务),则须注意如下事项: 1.在项目中引用using System.Transactions命名空间(先要在添加net组件的引用); 2.具 ...

  7. 【关键词排名提升工具】快排宝快速提升网站排名

    我们公司是一个小公司,规模不是很大.我最开始只是公司的客服人员,老板觉得工作中闲余时间较多,就安排加增网站的SEO工作,可是完全不懂,是纯小白.怎么办呢?于是从网上各种学习,各种恶补,理论知识一大堆, ...

  8. 【权限提升】61 Redis Postgresql数据库提权

    目录 redis数据库权限提升 Redis未授权访问漏洞利用 1. 利用计划任务执行命令反弹shell 2. 写ssh-keygen公钥后 使用私钥登录 3. 往web路径写webshell 修复方案 ...

  9. 数字化如何赋能电力调度、提升电网调度精准度灵活性、提升新能源消纳能力?互联网人如何参与泛在电力物联网和能源互联网?

    数字化赋能电力调度 提升电网调度精准度灵活性.提升新能源消纳能力 智能电站.虚拟电网.储能电站都需要更加灵活的电力调度,电力调度需要更加数字化.智能化,以适应新能源间歇式电源的并网.伴随着分布式能源. ...

最新文章

  1. 扫码点餐小程序源码_扫码点餐小程序有什么用?怎么制作?
  2. 《Spring_four》团队作业4—基于原型的团队项目需求调研与分析
  3. Failed to load http://localhost:3000/products: The 'Access-Control-Allow-Origin' header has a value
  4. JavaScript 回调函数中的 return false 问题
  5. maven 公共模块依赖_「spring-boot 源码解析」spring-boot 依赖管理
  6. CAN总线技术 | 物理层04 - 终端电阻与双绞线(特性阻抗120欧)
  7. Visio2007 与Microsoft Studio 2008不兼容
  8. 在Angular 8中使用自定义MultiSelect下拉菜单创建动态行
  9. 如何交叉编译 移植 QT
  10. NFC Enable 过程分析(三)
  11. GCN、GAT、凸优化、贝叶斯、MCMC、LDA
  12. Android Window 9问9答
  13. jquery jqplot pierenderer 饼图百分比小于3的无法显示DataLabels
  14. Java中成员变量、局部变量和静态变量的区别
  15. db2mysql下载_db2SQL命令
  16. 软件架构设计入门学习
  17. 微信小程序笔记 -- 数据库
  18. Hadoop生态系统完整组件及其在架构中的作用
  19. C# .NET 解决提示“由于应用程序配置不正确,应用程序未能启动..”的错误
  20. bzoj3238 [Ahoi2013]差异 后缀自动机

热门文章

  1. 关于编译PCL1.71
  2. Java微信公众平台开发(二)--微信服务器post消息体的接收
  3. 标签有关用法以及锚点定位;
  4. 浅谈同城双中心的网络部署模型
  5. redis desktop manager 连接外网redis服务器
  6. 双链集合添加删除算法
  7. 读取Exchange的用户未读邮件数3种办法
  8. ASP网站精品源码集合(免积分下载)
  9. 个人理财助手2009 V2.4
  10. RNFL视网膜神经纤维层报告(青光眼检测)解读