为什么事务不能在带有@REQUIRES_NEW注释的自调用ejb方法中提交

时间:2013-04-07 14:20:53

标签: jpa ejb java-ee-6 jta jboss6.x

首先,我想在这种情况下解释我自己调用的ejb方法。我有一个有状态会话bean,其中有一个方法可以启动一个新事务(由@REQUIRES_NEW注释)。要在bean内部调用此方法并使注释生效,我使用SessionContext#getBusinessObject()来实现@EJB的效果( @EJB此处导致stackoverflow?!) 。我的代码如下所示:

@Stateful
@Local
public class TransactionTest implements ITransactionTest {

  @PersistenceContext(unitName="Table",Type=PersistenceContextType.EXTENDED)

  private EntityManager manager;

  @Resource
  SessionContext sc;

  ITransactionTest me;

  @PostConstruct
  public void init(){
    me = this.sc.getBusinessObject(ITransactionTest.class);
  }

  public void generateRecord(int i) throws RuntimeException{
    Record record = new Record();
    record.setId(i+"");
    record.status(1);
    manager.persist(record);
    manager.flush();  //If not flush, result is correct. Why? 
    me.updateRecord(i);
  }

  @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
  public void updateRecord(int i) throws RuntimeException{
    try {
      Record record = manager.find(Record.class, i+"");
      record.setStatus(2);
      manager.flush();
    } catch(Exception e) {
      e.printStackTrace();
      throw new RuntimeException();
    }
  }
}

同时,generateRecord()正常运行。控制台显示它执行'insert'和'update'HQL而没有任何异常(我使用Hibernate作为JPA提供程序)。但是,“更新”结果不会出现在数据库中。 为什么? updateRecord()是否正确提交?

另外,我以两种方式尝试:首先是在另一个bean中连续调用generateRecord()(它将不再调用updateRecord())和updateRecord()。它可以给我正确的结果。

第二个是删除第一个flush()。然后“插入”和“更新”HQL都将在第二个flush()执行。这种方法也可以产生正确的结果。

我的程序在JBOSS 6.1.0-Final下运行,数据库是Oracle。

最诚挚的问候,

Kajelas

0 个答案:

没有答案