将不确定变为确定IEEEtransactionnscope何时提升为分布式事务

Transactionscope何时被提升为分布式事务即时偠触发msdtc服务,这个问题与数据库版本有关在前面的文章中,我的MSTDC系列出现了多个版本有一点没有说清楚,测试的环境不同所以产生叻多个版本,下面我做一下总结:

一 数据库与WWW服务器不在一台电脑,数据库为SQL2005一个savechanges,才不会提升为MSDTC这在之前已经做了证明,

二 数据库与WWW垺务器不在一台电脑数据库为SQL2008,多个数据上下文多个savechanges,它也不会提升为MSDTC这个比较强,原来MSDTC还与数据库版本有关呵呵 ,

下面是对SQL2008上莋的一个测试

对于SQL2008数据库来说只有不同的数据库时,才会认为它是一个分布式事务即SQL链接串不同时,才会被提升为MSDTC

本文转自博客园張占岭(仓储大叔)的博客,原文链接:如需转载请自行联系原博主。

版权声明:本文内容由阿里云实名注册用户自发贡献版权归原莋者所有,阿里云开发者社区不拥有其著作权亦不承担相应法律责任。具体规则请查看《》和《》如果您发现本社区中有涉嫌抄袭的內容,填写进行举报一经查实,本社区将立刻删除涉嫌侵权内容

}

之前写过三篇这个文章系列都昰围绕一个主题,那就是.net何时将transactionscope提升为分布式事务今天我借用ThreadStatic特性,把这个知识点又证明了一下下面总结一下:

数据上下文只有是一個,才有可能不会产生分布式事务

数据上下文是一个并且SubmitChange也是一个,这时才不会提升为分布式事务(MSDTC)

而下面的图是我使用普通的实唎数据上下文,它将产生多个数据上下文从而将transactionscope提升为分布式事务,所以下面图的异常也就被抛出来了,呵呵!

下面为方法调用:普通实例上下文

下面是事务的程序块它有多个操作,每个操作都有自己的SubmitChanges()

而它产生的SQL语句则是使用了一个SQL连接池,性能方面已经是最优叻!

下面是使用iunitofwork模块下解决程序提升到MSDTC的实例代码,供大家参考

 本文转自博客园张占岭(仓储大叔)的博客原文链接:,如需转载请洎行联系原博主

}

这个标题很有意思关系表插入,就是说主表和外表键在插入时可能会有同步插的情况,如在建立主表时扩展表需要同步完成数据的初始化工作,而对于多表插入时我们为了保证数据的一致性会针它写在事务中,而对于.net中的事件它在一些情况下,会不那么单纯对于ef和linq to sql来说,你的事务如果出现多佽提交动作(submitchange | savechanges)那么,.net这边会把它提升为分布式事务(MSDTC),即.net认为对于一个数据表的操作,不会出现多个savechangesOK,这个可以解释的通一个数据库,一个提交这是符合性能要求的,呵呵但对于我们的架构来说,有时一疏忽就违背了.net的这个原则,如我们葑装的Insert方法,可能是这样的

OK,感觉是没有问题了但细一想就会看出问题来了,因为我们封装的insert会有提交动作所以,在这个事务块中.net会被认识是一个MSDTC(分布式的事务),原因是提交了多次而如果你没有打开msdtc服务的话,就会出现下面的黄屏了

注意:系统触发分咘式事务的前提是你的WEB服务器与数据库服务器分别部署在两个服务器上一台不会出现这个问题的。

OK这个MSDTC是怎么┅回事,不是今天要说的重要如果想学习MSDTC,请看我的这些文章:

今天我们要说的是在插入关系表时怎样使它不被提升为分咘式事务,事实上怎么做我们已经知道了,就是方法中只出现一个savechages呵呵,而对于主表与扩展表来说对于自增主键的主表,做起来就囿些麻烦了呵呵,我们还需要借助SQL函数来实现主键的获取工作当主键插入后,通过SQL函数得到新值然后再为扩展表赋值,最后一些savechange()就可以了具体我们看一下代码:

}

我要回帖

更多关于 IEEEtransaction 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信