1

我正在尝试使用 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 消息表明在addsaveToEM方法中,都存在“无事务”。

为什么不为每次调用创建一个新事务saveToEM?对我来说,该方法具有“无事务”是有道理的,add因为它被标记为NOT_SUPPORTED。但是 on 不REQUIRES_NEW应该saveToEM在每次调用时都创建一个新事务吗?(Glassfish 4.0,EclipseLink 2.5)

4

1 回答 1

0

因为 saveToEM 是在本地调用的,所以它被视为只是一个 java 方法,因此容器不会为调用启动事务。

于 2013-10-10T12:46:12.327 回答