分布式事务TransactionScope所导致几个坑

Posted cr-cool

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式事务TransactionScope所导致几个坑相关的知识,希望对你有一定的参考价值。

记录一下,个人见解,欢迎指正

错误:

1.该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D025)
2.事务已被隐式或显式提交,或已终止
3.此操作对该事务的状态无效。

通过分析得到这个是与分布式事务有关的问题。。有以下解决办法:

1.设置 数据库的链接字符串属性:  Enlist=false    类似于:Data Source="*;Initial Catalog=*;User ID=sa;Password=sa;Enlist=false;"     其实Enlist这个玩意儿默认是为true的。。表示是否开启事务登记。。   关闭的话,自然而然的就没了以上分布式事务所带来的的问题。

2.设置分布式事务的隔离机制。 上面的错误其实就是分布式事务交叉使用,所带来的TransactionScope里SqlClient 连接出错。所以理论上设置事务的隔离机制是可以解决问题的。(这种我没有实现)

3.设置客户端和服务端的DTC。打开控制面板->管理工具->组件服务,右击"本地DTC",属性--安全下,全勾上,事务管理器通信中的勾选"不要求进行验证“。意思大致上位开启远程/网络的事务支持。详细内容可以自行搜索。。

以上三个解决方式,个人建议。要是离不开分布式事务的话,就第三种方式。不想用分布式用第一种办法。有时间精力的话,可以试试第二种。另说,TransactionScope这个玩意儿真的是最好不要使用,亲身体会其性能跟稳定性较差。现在这么多好的ORM框架,随便一种都能将其秒杀。

以上是关于分布式事务TransactionScope所导致几个坑的主要内容,如果未能解决你的问题,请参考以下文章

TransactionScope:避免分布式事务

使用TransactionScope做分布式事务协调

ADO.NET中的TransactionScope何时需要启用MSTDC(分布式事务管理)

关于分布式事务的一个误解:使用了TransactionScope就一定会开启分布式事务吗?

探索逻辑事务 TransactionScope

TransactionScope 事务 = new TransactionScope() VS TransactionScope s = context.Connection.BeginTransac