2014-02-13 30 views
1

Pictorial representation of the issue如何在两个数据库中使用JTA事务?

使用App2.Uses CMT暴露出一些客户端API

应用1与应用2(EJB应用)交互管理的Jboss.We JTA事务使用JNDI查找正从应用2(Jboss的)的UserTransaction的。

  1. App1打电话给App2,使用UserTransaction's begin() and commit()将数据插入到DS2中。
  2. App1使用Hibernate JPA调用DS1,使用JPATransaction Manager将数据插入DS1。
  3. 是否有可能换上述两个DB操作在一个事务(分布式事务)

PFB描述要求

回答

2

为此it's要实现自己的事务资源的图像,能够加入正在进行的JTA交易。看到这个answer以及一些指导方针,看看如何完成的一种方法是查看数据库或JMS资源的XA驱动程序代码,并以此为基础。

这不是微不足道的事情,也是非常罕见的用例,通常在实践中通过采用替代设计来解决。一种方法是将必要的代码从App2提取到jar库中,然后在Tomcat中使用JTA事务管理器,如Atomikos连接到两个XA JTA数据源。

另一种方法是将SQL语句清理成数据库到tomcat中,然后在向JBoss发送同步调用之前查看它是否有效,如果JBoss事务处理完毕则返回结果。

取决于在tomcat中的提交/回滚。这并不能保证100%的时间都可以工作(网络故障等),但可能可以接受,具体取决于系统的作用和失败事务的业务后果。

还有一种方法是在JBoss端使操作可恢复,并在检测到错误时公开tomcat使用的补偿服务。为了做到这一点,制作两个服务器JBoss,你可以利用JBoss Narayana引擎,也可以参考这个answer

哪种方式更好取决于用例,但实现自己的XA事务服务是一项重大任务,我会更简单地更改设计。很少有项目正在这样做的原因是因为它很复杂,而且有更简单的选择。

相关问题