我使用 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
并且 DataSource
将 enlistResource
与 XAResource
交易。当 CccBean.qux
退出时,事务将被提交,事务管理器将在 DataSource 注册的两个 XAResource
上驱动两阶段提交。
关于jakarta-ee - 单个 JTA 事务中的多个 XA 数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18044378/