个人认为:可以。a,b,c接口必须有事务提交与回滚方法。但毕竟是在3个不同容器中,个人认为实现b,c接口还是有点技术。
如:b接口中有方法:beginTransaction(), execute(), commit(),rollback(),close().这5个方法是以某个标识(如:调用时的sessionId)区分connection.
    a,c接口的也是如此。
  a,b,c接口大概的调用顺序:
   try{
    a.beginTransaction();
     a.execute();
     b.beginTransaction();
     b.execute();
     c.beginTransaction();
     c.execute();
     c.commit();
     b.commit();
     a.commit();
   }catch(Exception e){
      c.rollback(); 
      b.rollback();
      a.rollback(); 
   }
   finally{
      c.close();
      b.close();
      a.close();
   }
   

解决方案 »

  1.   

    目前只有 J2EE 容器才能支持分布式事务处理对于数据库来说,那三个是持 XA 事务的。建议,在 J2EE 容器上绑定 XA 的 DataSource,并且绑定 JTA 事务。在其他各应用中均使用 JNDI 从 J2EE 容器中获取连接,并开启事务。
      

  2.   

    这是之前给其他网友回复关于分布式事务的一些内容,有兴趣的话可以看一下:在 JAVA 中要想使用分布式事务处理,需要使用 JTA。但是 JTA 在 J2SE 环境中是没办法测试的,必须在 J2EE 应用服务器中。J2EE 应用服务器为什么说会有好的、差的,免费的和商业的,其中最为重要的一点就是对于事务的处理能力。像开源的 J2EE 应用服务器在这一点上是没办法跟 WebLogic, WebSphere 这些商业 J2EE 应用服务器相比拟的。在 J2EE 环境中使用 JTA 事务与 Local 事务的代码是一模一样的,对于开发人员来说这绝对是希望听到的。Local 事务就是通常所称的 Connection 的事务。分布式事务一般采用一种称为 2-PC(两阶段提交)的协议进行处理,2-PC 是分布式事务处理协议。比如说一个事务涉及 Oracle、MySQL 和 MS SQLServer 三个数据库的操作,举个最简单的例子,要在这三个数据库中各插入一条数据,但必须保持在一个事务中,要三个插入全部成功才算成功,如果只成功了一个或者两个,那么所有的操作都进行回滚,而 2-PC 就是用来干这事的。两阶段提交需要有个中间协调人。在 Java 中只有 JTA 才能支持两阶段提交,而这个中间协调人就是 J2EE 应用服务器。继续刚才那个事务,两个阶段如下:一、各数据库在执行完 INSERT 后,J2EE 应用服务器在收到提交指令,这时通知各数据库进行事务提交准备。
    数据库在收到响应后,进行准备工作,基本上是一个预提交工作,如果能提交则响应 J2EE 应用服务器是 能成功提交的,如果无法提交则响应 J2EE 应用服务器是无法提交的。二、J2EE 应用服务器在收集到所有的响应之后进行判断,如果在第一阶段收到的信息都是可提交的,那么就通知所有的数据库进行提交;如果在第一阶段收到的信息有一个是无法提交的,那么就通知所有的数据库进行回滚操作。通过这些步骤,可以看出分布式事务处理是很耗时的,也是相当麻烦的。因为数据库在第一阶段给事务协调器响应后如果能提交,在第二阶段就必须要保证事务能被提交,这是数据库要做的事情。这里的 J2EE 应用服务器是 2-PC 的协调者。2-PC 在 JAVA 中不仅可以用于分布式数据库事务,也能应用于 JMS 事务。要支持分布式事务,那么数据库就必须支持两阶段提交协议,否则是不能支持的。 
      

  3.   

    1 楼的代码在从严而言是不可以的,因为 rollback 也可能会失败。            c.rollback();  
                b.rollback();
                a.rollback();   如果 c.rollback 成功了,b.rollback 也成功了,但是 a.rollback 失败了,那将会导致数据的不致性,违背了事务的原则。
      

  4.   

    简单的方法是使用同一个connection处理你的insert,update语句。
    只用一个commit和一个rollback.
      

  5.   

    在a接口中如下public void a() {
         Connection connectionOfA= ....;
         // connectionOfA do something.
         InterfaceExcuter.run("192.168.1.100:8080", "b"); // connectionOfB do somthing.
         InterfaceExcuter.run("192.168.1.101:8080", "c"); // connectionOfC do somthing.
    }假定InterfaceExcuter是一个可以执行远程服务器上的工具类,b接口和c接口分别有自己的Connection.
    JTA据我所知,要在a接口中获取到b,c的Connection在a中统一进行事务控制, 但是这种情况如何做到事务控制呢?
      

  6.   

    需要借助第3方开源包实现jta,两阶段提交。不过mysql对分布是事务支持的不是很好。
    1。BTM:http://docs.codehaus.org/display/BTM/Home2。JOTM:http://jotm.objectweb.org/
      

  7.   

    老兄,你想的不对。如果会发生异常,比如在a.commit();出现异常,那么a根本没提交,所以回滚失败没关系,执行到任何其他语句也一样,你看看
      

  8.   


    rollback没有问题,问题在于commit。如果c接口commit成功,b失败,那就不行了