我正在尝试使用 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
。但是 on 不REQUIRES_NEW
应该saveToEM
在每次调用时都创建一个新事务吗?(Glassfish 4.0,EclipseLink 2.5)