java如何实现分布式事务控制?

q1352013520 2012-05-07 02:39:36
tomcat里面的a接口向mysql插入数据,weblogic里面的b接口向oracle删除数据,jetty里面的c接口向db2更新数据.
现在a接口里面添加了2行代码,即调用b接口和c接口,当c接口更新失败的时候如何实现a接口与b接口的事务性回滚?
...全文
5580 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
饮空 2015-01-12
  • 打赏
  • 举报
回复
引用 1 楼 Looking_Glass 的回复:
个人认为:可以。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(); }
rollback没有问题,问题在于commit。如果c接口commit成功,b失败,那就不行了
皇家肆掠者 2014-09-22
  • 打赏
  • 举报
回复
引用 4 楼 bao110908 的回复:
1 楼的代码在从严而言是不可以的,因为 rollback 也可能会失败。 c.rollback(); b.rollback(); a.rollback(); 如果 c.rollback 成功了,b.rollback 也成功了,但是 a.rollback 失败了,那将会导致数据的不致性,违背了事务的原则。
老兄,你想的不对。如果会发生异常,比如在a.commit();出现异常,那么a根本没提交,所以回滚失败没关系,执行到任何其他语句也一样,你看看
nuren 2014-05-30
  • 打赏
  • 举报
回复
如果其中一个是接口调用你怎么办,比如你调用了某个接口是负责插入数据的。咋整。那个接口的事务不是被你控制的
昨日凡阳 2012-05-08
  • 打赏
  • 举报
回复
跨越数据库了,已经不是同一个域了。
古布 2012-05-08
  • 打赏
  • 举报
回复
需要借助第3方开源包实现jta,两阶段提交。不过mysql对分布是事务支持的不是很好。
1。BTM:http://docs.codehaus.org/display/BTM/Home

2。JOTM:http://jotm.objectweb.org/
q1352013520 2012-05-08
  • 打赏
  • 举报
回复
在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中统一进行事务控制, 但是这种情况如何做到事务控制呢?
coooliang 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

简单的方法是使用同一个connection处理你的insert,update语句。
只用一个commit和一个rollback.
[/Quote]
不好意思,我回答的不是分布式了。
coooliang 2012-05-08
  • 打赏
  • 举报
回复
简单的方法是使用同一个connection处理你的insert,update语句。
只用一个commit和一个rollback.
  • 打赏
  • 举报
回复
1 楼的代码在从严而言是不可以的,因为 rollback 也可能会失败。

c.rollback();
b.rollback();
a.rollback();

如果 c.rollback 成功了,b.rollback 也成功了,但是 a.rollback 失败了,那将会导致数据的不致性,违背了事务的原则。
  • 打赏
  • 举报
回复
这是之前给其他网友回复关于分布式事务的一些内容,有兴趣的话可以看一下:

在 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 事务。

要支持分布式事务,那么数据库就必须支持两阶段提交协议,否则是不能支持的。
  • 打赏
  • 举报
回复
目前只有 J2EE 容器才能支持分布式事务处理

对于数据库来说,那三个是持 XA 事务的。

建议,在 J2EE 容器上绑定 XA 的 DataSource,并且绑定 JTA 事务。在其他各应用中均使用 JNDI 从 J2EE 容器中获取连接,并开启事务。

Looking_Glass 2012-05-07
  • 打赏
  • 举报
回复
个人认为:可以。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();
}

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧