3

我一直在使用 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。

4

1 回答 1

1

是的,这真的很容易。CccBean.qux启动一个新的 XA 事务,调用者AaaDao/BbbDao重用相同的事务(因为REQUIRED正如你指出的那样)。使用's 和EntityManagerwill an与Transaction。当 C退出时,事务将被提交,事务管理器将驱动数据源注册的两个阶段的两阶段提交。DataSourceDataSourceenlistResourceXAResourceccBean.quxXAResource

于 2013-09-07T15:19:39.063 回答