我正在试验JTA事务,并且无法理解为什么标记为始终创建新事务的方法没有(代码被编辑为相关内容)。这是前一个问题,我问一个类似话题的重新工作(here):为什么新的JTA交易没有被创建?
@Stateless
public class StaffEntityOps
{
@Resource TransactionSynchronizationRegistry txReg;
private void transactionStatus(String where)
{
String msg;
int stat = txReg.getTransactionStatus();
switch (stat) {
case STATUS_ACTIVE:
msg = "Active";
break;
case STATUS_NO_TRANSACTION:
msg = "No Transaction";
break;
default:
msg = "Other: " + stat;
}
System.out.println("Transaction status in " + where + ": " + msg);
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void saveToEM(EntityManager em, StaffEntity staffEntity)
throws ...
{
transactionStatus("saveToEM: ");
em.persist(staffEntity);
em.flush();
}
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void add(StaffEntity staffEntity)
throws ...
{
// Entity Managers emDB1 and emDB2 are injected into class.
transactionStatus("add: ");
saveToEM(emDB1, staffEntity);
saveToEM(emDB2, staffEntity);
}
上面的想法,是调用add(StaffEntity staffEntity)
方法坚持新StaffEntity
到一组非XA数据源。我已经使用bean管理的事务解决了这个问题(前面的问题,上面引用的),还有XA-DataSources。我仍然想确定是否有办法使用容器管理事务和非XA数据源(主要是了解@TransactionAttribute
注释如何影响事物)。
上面的尝试试图通过隔离自己的方法中的持久性并用REQUIRES_NEW
标记它,为每个数据库明确创建一个新事务。这不起作用 - sysout消息表明,在add
和saveToEM
方法中,都有“无事务”。
为什么不是每次调用saveToEM
都创建一个新事务?对我来说,add
方法有“无交易”,因为它标记为NOT_SUPPORTED
。但是saveToEM
上的REQUIRES_NEW
不应该在每次调用时创建一个新事务? (GlassFish 4.0,EclipseLink 2.5)
你如何获取/设置em实例?您是否尝试过Glassfish上的JPA示例,例如https://blogs.oracle.com/arungupta/entry/jpa_2_1_implementation_eclipselink? – Chris
每个em实例都有类似'@PersistenceContext(unitName =“jdbc/.. something ..”)的东西EntityManager emdb1;'我应该注意到使用JPA一直工作正常 - 直到我尝试使用超过1数据源。只要我尝试同时使用两者,我会得到一个非XA错误(我明白)。所以我试图将persist分离到不同的数据源,以避免使用XA数据源。 – CraftWeaver
我相信因为saveToEM被本地调用,容器不会为该调用启动一个事务。它被视为只是一种Java方法。 – Chris