对于多个异构系统,在数据源,架构什么都不同的情况下,如何保证事务的一致性?spring能不能解决分布式,异构系统的事务问题?希望有人能帮忙点拨下

解决方案 »

  1.   

    多个异构系统指的是什么?是不同程序语言实现的系统么?Spring 能解决分布系统的能力很有限,毕竟其本身就不是为分布式应用来设计的。
      

  2.   

    分布式事务处理不仅需要有一个事务的协调方,在数据库上,该数据库也必须支持 XA 事务。像 MySQL 中必须使用 5.0 以上的版本,而且必须是 InnoDB 引擎,MySQL JDBC 驱动必须在 5.0 版本之上才能支持 XA 事务。对于其他的商业数据库都能支持 XA 事务。在 Spring 中也可以使用 XA 事务,不过必须借助于 jOTM 这个框架。当然了,Spring + jOTM 进行作为 XA 事务的协调者是无法和 J2EE 容器相提并论。另外,免费开源的 J2EE 应用服务器与商业的 J2EE 应用服务器之所以有区别,基本上都在于事务的处理能力上。一个 J2EE 应用服务器的优劣就在于对于事务处理的能力。
      

  3.   

    多语言跨平台的异步事物不好做,尤其是在拓扑形式的请求以及并发的情况下。这个问题很大,也不是一句两句就能说清楚,要从个平台的架构以及负责的服务来决定方案。不要把spring想象的太过强大,spring也是java语言开发的
      

  4.   


    因为楼主提到 Spring 了,我想其他语言的话也没有 Spring 这种东西的,呵呵。如果涉及到异构平台集成的话,那问题就复杂化了。在 J2EE 中使用 JMS、JCA 和 WebService 可以进行异构平台的集成,这些东西都很复杂,是 EAI 需要讨论的问题了。
      

  5.   

    在 java.net 上有个 WSIT 可以支持很多 WS-* 规范,其中就有涉及 WebService 事务操作的 WS-AtomicTransaction 和 WS-Coordination。关于 WS-TX 在那上面还有个例子,服务端是使用 JMS 和 JDBC 作为 XA 的原子事务,客户端那个例子实现了两个,Servlet 的和 C# 的。https://wsit-docs.dev.java.net/releases/1.1/ahiip.html那个例子是部署在 Glassfish 应用服务器上的,构建和部署脚本在那里都有。至于其他 Java WebService 的框架,比如 CXF 目前还不支持 WS-AtomicTransaction 和 WS-Coordination,而 AXIS 2 需要 AXIS 的子项目 Kandula 才能支持。http://www.oschina.net/p/apache+kandula
      

  6.   

    不好意思,今晚加班很晚才有空,继续今天的问题,其实我想问的是webservice是怎么控制事务的,大家都知道,这种无状态传输协议,不能像我们一个系统里面那种方式去管理事务那么容易,如果断网了,停电了,都会自动事务回滚,但是远程调用就不会,他不清楚远程到底发生了什么,更加不会回滚,一直那么傻傻的等,直到死掉,有人提出设置个超时时间,超过这个时间自动回滚,也有人提出"两段式"控制的概念,先把全部要控制的事务预提交,等全部预提交成功反馈结果之后,再一起持久化提交,也有人提出用spring的jta控制....所知道的都非常的零散,有些甚至不准确,希望有经验的高手能指点一二,其实就是故讲讲在自己在做webservice接口服务,并在客户端应用的过程中事务,你是如何控制的,两个事务,很多个事务,批量处理,甚至是调用多个远程系统之间.
     继续等待高手赐教,谢谢大家的参与讨论!
    另:如未自己做过测试,甚至亲身亲历,切莫随意抓抄转载,以免误导大家
      

  7.   

    为把问题都清晰化,我举个例子,大家以此意境下,看看能不能整出来:
    A 服务端系统: struts2+spring2.5+hibernate3.2+axis2 +oracle10g..神秘封装.. 全注解配置
    B 服务端系统: struts1+spring2.0+iBATIS2 +xfire+ SqlServer2000..神秘封装.. 全xml配置文件配置
    C 服务端系统: jsp+servlet+简易jdbc封装+mysql5.0  现在c这个公司是给A和B这两个大公司做增值扩展的,假如现在大家就是A和B这两家公司其中一家系统架构师,你们的系统对外提供接口给别人用,同时还要告诉c这家小公司,你在用到事务的时候该XX怎么做,底层全部封装.
        如何维护事务,才能保证其安全性,数据的一致性!
      

  8.   


    你这个例子语言相同,分布式事物处理,可以利用jta解决。你的问题似乎不在解决问题上,而是不知道如何解决上,如何配置上。
      

  9.   

    主要是没有遇见过,所以毫无概念,技术上已经限定了,都是java语言,相信做过银行接口,电信接口的同学一定多少知道一点里面的原理,而且这方面的技术知道的人确实不是很多,培训机构和网摘就算了,他们只会讲hello world 调用
      

  10.   

    [Quote=引用 15 楼 kokobox 的回复:]
    引用 12 楼 shimiso 的回复:对,就是毫无概念,有没有关于更详尽的资料,或者案例推荐一下,呵呵
      

  11.   

    说实在的,我还是没看明白你到底想要问什么。你开帖道“异构系统事务”,在之前的回复中已经说了如何整何异构系统。至于事务方法也说了使用 JTA,或者使用开源的 jOTM 框架。jOTM 我没用过。但 JTA 必须在 J2EE 应用服务器中使用。使用 JTA 的方式很简单,把数据源配置成为 JTA 类型就可以了。如果想自己手工控制事务,在 EJB 3 中使用 @Resource 注入 UserTransaction 对象,J2EE 容器会自行从 JNDI 中查找 UserTransaction 对象并注入进来。
      

  12.   

    jta只是用来解决不同数据源之间的事务的,作为服务商是怎会轻易将数据源随便暴露给第三方?可以先参考下Web Service 事务控制原理:http://www.cnblogs.com/chinhr/archive/2010/04/16/1713514.html
    Web Service 和jta(分布式的两阶段事务)没有关系,因为两个系统并不一定都支持,web services 事务管理和数据库中的事务管理两者区别意义很大.http://xml.apache.org/axis/是一个soap实现,可以在axis 上发布web service。
    现在的问题是:有没有人做过axis上2个web service同属于一个transaction的使用经验!
    我的应用情况是这样的:web service 1:提供定单接收功能;是一个Stateless SessionBean
    其操作大致是:
    a.产生定单,插入定单库;
    b.减少库存表中的当前可售数量;
    web service 2:提供发送消息服务;用jms实现
    操作是:
    完jms队列中存放一条消息。整个事务是先调用web service 1,后调用web service 2;只有当2个操作均成功了,提交事务;否则回滚。谢谢!
      

  13.   


    真不知道你说这样的话是什么意思。谁毁了你的自尊?我们在前面的回复中有哪一句话伤过你的自尊了?WebServices 之前本身就是不支持事务操作的,这么复杂的一个问题,你在帖子正文中只有不到两行的描述,让你把问题描述得更清楚一些,我不知道是你伤了别人的自尊,还是别人伤了你的自尊!
      

  14.   

    我最近也遇到lz的问题,如何实现这种事务控制。
    我们的场景是:
    1.我们提供的服务,数据库使用oracle,我们为客户提供接口
    2。客户服务器,数据库使用mysql
    问题,如何实现这个数据库的事务控制,以保持两个数据库的数据一致性?