【问题标题】:Multiple XA data sources in a single JTA transaction单个 JTA 事务中的多个 XA 数据源
【发布时间】:2013-08-04 15:08:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    是的,就是这么简单。 CccBean.qux 开始一个新的 XA 事务,AaaDao/BbbDao 的调用者重用相同的事务(因为 REQUIRED 正如你所指出的那样)。 EntityManager 使用 DataSourceDataSourceenlistResourceXAResource 与事务。当 CccBean.qux 退出时,事务将被提交,事务管理器将在 DataSource 注册的两个 XAResource 上驱动两阶段提交。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多