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

标签 jakarta-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。

最佳答案

是的,这真的很容易。 CccBean.qux 开始一个新的 XA 事务,AaaDao/BbbDao 的调用者重用同一个事务(因为 REQUIRED 正如你指出的那样)。 EntityManager 使用 DataSource 并且 DataSourceenlistResourceXAResource交易。当 CccBean.qux 退出时,事务将被提交,事务管理器将在 DataSource 注册的两个 XAResource 上驱动两阶段提交。

关于jakarta-ee - 单个 JTA 事务中的多个 XA 数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18044378/

相关文章:

java - 由 : javax. persistence.TransactionRequiredException 引起:在带有 Spring JTA 事务的 Weblogic 上

java - 学习哪个java web框架?

jakarta-ee - debug在servlet配置中的作用是什么?

web-services - 在 weblogic 中更改 ejb3 webservice url

java - 仅使用 @Transactional 时,持久性单元未启动

在循环中执行插入时出现 javax.persistence.TransactionRequiredException

java - 非 2xx http 代码的 Servlet 响应过滤器

java - 使用 Java EE 进行简单的工作流程管理

java - 从单独 Web 应用程序的 POJO 类引用 EJB Local home

java - SessionContext.getBusinessObject() 的返回值与 bean 中使用的 'this' 关键字有何不同?