黄东旭解析 TiDB 的核心优势
594
2023-04-03
将不确定变为确定~transactionscope何时提升为分布式事务?(sql2005数据库解决提升到MSDTC的办法)
对于transactionscope不了解的同学,可以看我的相关文章
对于这种事务,如果希望程序出错自动回滚,必须将异常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,我们将上面代码进行一个封装,让它访问起来更方便一些,看代码:
///
在使用时,我们可以这样来做,不用TransactionScope,而是用TransactionScopeNoMsdtc呵呵。
EntityFrameworks.Data.Core.TransactionScopeNoMsdtc.UsingNoMsdtc(Db, () => { insert1(); insert2(); });
感谢阅读!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。