在.net 1.1或者.net 2.0中要实现分布式事务,如果不涉及远程调用,如调用remoting或者web service的方法,应该说是一件非常简单的事情,只需要用COM+(1.1/ServiceDomain)或者TransactionScope(2.0),通过msdtc协调即可。

但是当事务方法中还需要调用remoting或者web service(不使用ws-at)时,由于remoting不支持事务传播机制,因此即便客户端调用remoting后发生错误回滚,remoting server上已经执行的操作(如数据库操作)也已经无法回滚。

但是在一些特殊的应用中,数据完整性比性能更重要的情况下,如果希望客户端回滚时,remoting server上执行的操作也可以回滚,那么可以使用msdtc的Transaction Internet Protocol(TIP)协议(事实上,msdtc除了支持常用的OleTx分布式事务协议外,还支持XA和TIP协议),让客户端启动的事务“传播”至Remoting Server,那样只要Remoting Server同样使用客户端传播过来的事务,即可实现Remoting下的分布式事务。具体的做法如下:
(1)由于TIP事务协议默认是不启用的,所以第一步首先配置MSDTC支持TIP事务。在msdtc属性页中的点击“安全配置”后选中“启用TIP事务”。
(2)实现ITipTransaction 接口,用于从ContextUtil.Transaction查询TIPTransaction的相关属性。具体是获取TIP事务的TIP URL属性。

ITipTransaction 接口的定义:

[ Guid("17CF72D0-BAC5-11d1-B1BF-00C04FC2F3EF") ]
    [ InterfaceType(ComInterfaceType.InterfaceIsIUnknown) ]
    public interface ITipTransaction
    {
        void Push([In, MarshalAs(UnmanagedType.LPStr)] string pszRemoteTmUrl,
            [In, Out, MarshalAs(UnmanagedType.LPStr)] ref string ppszRemoteTxUrl);

        void GetTransactionUrl([In, Out, MarshalAs(UnmanagedType.LPStr)] 
            ref string ppszLocalTxUrl);
    } 

获取TIP URL的代码:

string url = null; 
                
                    ITipTransaction trxn = (ITipTransaction) ContextUtil.Transaction; 
                
                    trxn.GetTransactionUrl(ref url);
                

(3)通过一定的机制,将获取得到的TIP URL传递到Remoting服务器。
要将tip url传递到remoting server方法很多,可以通过参数传递过去,也可以通过callcontext传递过去,具体可以看附件的代码。

(4)在Remoting Server中,利用TIP URL连接到客户端的事务中,并启动事务。
获取到client传递过来的tip url后,就可以通过它连接到现有的事务协调器上,具体代码:

TransactionCallContext ctx = (TransactionCallContext)CallContext.GetData("DTCTxID");
ServiceConfig config = new ServiceConfig();
                
                if (ctx != null)
                {
                    config.TipUrl = ctx.TipUrl;
                    config.Transaction = TransactionOption.RequiresNew;
                }
                else
                {
                    config.Transaction = TransactionOption.Disabled;
                }
                
                using(TransactionScope scope = new TransactionScope(config))
                {
                    rows = UpdatePoint();

                    if( rows > 0 )
                    {
                        scope.SetComplete();
                    }
                }

通过上面的方式,就可以实现Remoting下的分布式事务了。

源代码:
/Files/walkinhill/RemotingTransactionDemo.rar

参考文章:
http://dotnetjunkies.com/WebLog/chris.taylor/articles/54503.aspx
http://www.codeproject.com/csharp/complus_tip.asp

尽管通过上面的方式实现了remoting下的分布式事务,但是还是有些麻烦,而且一不小心还是会出错的。相比之下,wcf内部已经实现了这样的事务机制,而且只需要配置一下和外加一些特性就可以实现。而且还支持oletransactions和ws-at协议,看来以后用wcf方便多了。

最后有一点,这里只是了解了remoting下的分布式事务,但是具体要不要用,还是要充分考虑性能的问题,毕竟远程调用对性能的消耗还是很大的,特别是事务下对资源的锁导致的性能下降更严重:)

.net remoting的事务传播以及wcf分布式事务相关推荐

  1. mysql分布式事务wcf_WCF系列_分布式事务(下)

    1.WCF分布式事务例子 这里也用转账的例子说事. 用户在系统A和系统B都有账户,账户间的资金可以互转,系统A的资金减少多少,系统B的相应账户的资金就增加多少. 系统A机器上有数据库AccountA, ...

  2. 分布式事务实践 解决数据一致性 分布式事务实现,模式和技术

    分布式事务实现,模式和技术 分布式事务实现,模式和技术 介绍分布式事务的定义.原则和实现原则,介绍使用Spring框架实现分布式事务的几种方式,包括使用JTA.Spring事务同步.链式事务等,并通过 ...

  3. 深入理解分布式事务,高并发下分布式事务的解决方案

    深入理解分布式事务,高并发下分布式事务的解决方案 参考文章: (1)深入理解分布式事务,高并发下分布式事务的解决方案 (2)https://www.cnblogs.com/betterboyz/p/8 ...

  4. rocketmq整合mysql事务_分布式事务(4)---RocketMQ实现分布式事务项目

    摘要: ,但是returnLocalTransactionState.COMMIT_MESSAG的时候*服务挂了,那么最终Brock还未收到消息的二次确定,还是个半消息,所以当重新启动的时候还是回调这 ...

  5. 分布式事务详解【分布式事务的几种解决方案】彻底搞懂分布式事务

    文章目录 一.基本概念 什么是事务 本地事务 分布式事务 分布式事务产生的场景 二.分布式事务基础理论 CAP理论 CP - Consistency/Partition Tolerance AP - ...

  6. 22、Camunda 补偿事件、事务子流程、分布式事务一致性

    Camunda 补偿事件.事务子流程.分布式事务一致性 总结 补偿事件 Compensation Event 事务子流程 事务子流程中如果有取消事件,必须要有边界取消中断事件 事务子流程外部可获取取消 ...

  7. Spring事务传播行为-编程式事务

    1. 编程式事务 Spring 事务管理有两种方式: 编程式事务:通过编码方式实现事务: 声明式事务:基于AOP实现,如 @Transactional 声明式注解. 2. 实现原理 编程式事务基于Tr ...

  8. 【分布式事务】GitHub上分布式事务框架压测性能对比

    一.前言 随着项目逐步以微服务开发为趋势,逐渐呈现一个服务对应一个数据库.从中产生了分布式事务的问题:一个操作先后调用不同的服务,要保证服务间的事务一致性,这就是分布式事务解决的问题. 本次调研,根据 ...

  9. oledb 访问接口sqlncli10返回了消息 没有活动事务_这样理解分布式事务你是不是就会懂了?...

    分布式事务主要解决分布式一致性的问题.说到底就是数据的分布式操作导致仅依靠本地事务无法保证原的性.与单机版的事务不同的是,单机是把多个命令打包成一个统一处理,分布式事务是将多个机器上执行的命令打包成一 ...

最新文章

  1. CS131-专题7:图像特征(SIFT算法)
  2. 比特币黄金BTG遭遇51%算力攻击,即将归零?
  3. Java基础之Comparable接口和Comparator接口的比较
  4. matlab中多少角度,MATLAB 计算图像旋转角度
  5. Ubuntu共享WiFi(AP)给Android方法
  6. Java黑皮书课后题第6章:*6.39(几何:点的位置)编程练习题3.32显示如何测试一个点是否在一个有向直线的左侧、右侧或在直线上,编写一个程序,输入三个点p0p1p2,显示p2是否在直线p0p1
  7. windows 搭建python 虚拟环境 写程序_Sublime下配置python编译环境及搭建虚拟环境:(windows下大致相同)...
  8. Java自定义JSlider UI
  9. AI加持 百度输入法语音识别准确率相对提升15%
  10. 有趣的EditView为空时的抖动效果(用户名和密码)--第三方开源--ClearEditText
  11. [转]中国七大顶级黑客X档案
  12. ureport2项目使用
  13. 游戏对战平台编写流程研究
  14. 狐狸找兔子问题 C语言
  15. 在Linux中传输文件/目录的scp命令
  16. 【读书笔记】读《自制力:如何掌控自己的时间与生活?》 —— 25条自制力掌控法则
  17. adb 打开 diag 端口用qpst备份恢复qcn
  18. layui数据表格分页简单实现
  19. wxPython:一曲MFC时代的挽歌,更是理想主义的绝唱
  20. 职业梦想是计算机的英语作文,我梦想的职业高中英语作文

热门文章

  1. Java Applet 问题汇总
  2. git 撤销全部的commit_git如何撤销commit的方法(未push)
  3. 并发执行linux命令结果混乱,Shell脚本--并发执行
  4. 设置log缓存_全局变量、事件绑定、缓存爆炸?Node.js内存泄漏问题分析
  5. 查看oracle归档大小,ORACLE RAC按实例统计每天归档日志大小
  6. win10启动项_win10 -- 取消不需要的开机启动项和服务项加快win10系统开机速度
  7. MySQL的SQL预处理(Prepared)
  8. java保留小数点后几位,不足的用0补
  9. mybatis-plus -- mapper中foreach循环操作(新增,或修改)
  10. Zookeeper 3.6.0启动时 8080端口被占用