我已经使用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。
答案 0 :(得分:1)
是的,真的很容易。 CccBean.qux
启动新的XA事务,AaaDao
/ BbbDao
的调用者重用相同的事务(因为REQUIRED
指出)。 EntityManager
使用DataSource
和DataSource
将enlistResource
与XAResource
一起使用交易。当C ccBean.qux
退出时,事务将被提交,并且事务管理器将在DataSource注册的XAResource
上驱动两阶段提交。