为什么没有创建新的JTA事务?

时间:2013-10-09 13:56:50

标签: jpa eclipselink jta

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

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

1 个答案:

答案 0 :(得分:0)

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