单个JTA事务中的多个XA数据源

时间:2013-08-04 15:08:57

标签: java-ee ejb-3.0 jta java-ee-5 xa

我已经使用Java EE平台进行了一段时间的编程,但有时候我错过了更大的图片。

使用EJB和Container-Managed Transactions,如何在单个事务中对多个数据源执行操作?

我的代码如下所示:

aaa-ejb模块

包含指向第一个数据源的persistence.xml

@Stateless
public class AaaDao {
    @PersistenceContext
    EntityManager em;

    // using defaults: @TransactionAttribute(REQUIRED)
    public void foo(...) {
        em.persist(...);
    }
}

bbb-ejb模块

包含指向第二个数据源的另一个persistence.xml(不同的持久性单元)。

@Stateless
public class BbbDao {
    @PersistenceContext
    EntityManager em;

    // using defaults: @TransactionAttribute(REQUIRED)
    public void bar(...) {
        em.persist(...);
    }
}

ccc-ejb模块

取决于上述两个模块。

@Stateless
public class CccBean {
    @EJB AaaDao aaaDao;
    @EJB BbbDao bbbDao;

    // using defaults: @TransactionAttribute(REQUIRED)
    public void qux(...) {
        aaaDao.foo(...);
        bbbDao.bar(...);
    }
}

我的意思是:这真的很容易吗?当事情似乎“神奇地”起作用时,我总是有点怀疑,我总是怀疑有一个“抓住”。

在Oracle WebLogic 10.3上使用Java EE 5,EJB 3.0,JPA 1.0。

1 个答案:

答案 0 :(得分:1)

是的,真的很容易。 CccBean.qux启动新的XA事务,AaaDao / BbbDao的调用者重用相同的事务(因为REQUIRED指出)。 EntityManager使用DataSourceDataSourceenlistResourceXAResource一起使用交易。当C ccBean.qux退出时,事务将被提交,并且事务管理器将在DataSource注册的XAResource上驱动两阶段提交。