个人认为:可以。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();
}
如: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();
}
数据库在收到响应后,进行准备工作,基本上是一个预提交工作,如果能提交则响应 J2EE 应用服务器是 能成功提交的,如果无法提交则响应 J2EE 应用服务器是无法提交的。二、J2EE 应用服务器在收集到所有的响应之后进行判断,如果在第一阶段收到的信息都是可提交的,那么就通知所有的数据库进行提交;如果在第一阶段收到的信息有一个是无法提交的,那么就通知所有的数据库进行回滚操作。通过这些步骤,可以看出分布式事务处理是很耗时的,也是相当麻烦的。因为数据库在第一阶段给事务协调器响应后如果能提交,在第二阶段就必须要保证事务能被提交,这是数据库要做的事情。这里的 J2EE 应用服务器是 2-PC 的协调者。2-PC 在 JAVA 中不仅可以用于分布式数据库事务,也能应用于 JMS 事务。要支持分布式事务,那么数据库就必须支持两阶段提交协议,否则是不能支持的。
b.rollback();
a.rollback(); 如果 c.rollback 成功了,b.rollback 也成功了,但是 a.rollback 失败了,那将会导致数据的不致性,违背了事务的原则。
只用一个commit和一个rollback.
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中统一进行事务控制, 但是这种情况如何做到事务控制呢?
1。BTM:http://docs.codehaus.org/display/BTM/Home2。JOTM:http://jotm.objectweb.org/
rollback没有问题,问题在于commit。如果c接口commit成功,b失败,那就不行了