我正在尝试使用JTA事务,并且无法理解为什么标记为始终创建新事务的方法不会(代码编辑为相关内容)。这是我在类似主题(here)上提出的上一个问题的重做:
@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
。但是,REQUIRES_NEW
上的saveToEM
不应该在每次调用时创建新事务吗? (Glassfish 4.0,EclipseLink 2.5)
答案 0 :(得分:0)
因为saveToEM是在本地调用的,所以它被视为一个java方法,因此容器不会启动该调用的事务。