会话bean中的ejb3隔离(自治)事务

时间:2012-05-23 10:44:49

标签: java transactions ejb transaction-isolation

我正在使用XA(两阶段)交易。我想通过Log类和Entity Manager登录到一个日志表。我在EJB Session bean中的方法如下:

private void logError(Throwable throwable) {
    LogEntity logEntity = new LogEntity();
    // Set everything
    entityManager.persist(logEntity);
}

我想在隔离(自治)交易中独立于任何“外部”交易。我已尝试在方法名称之前添加@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED),但无效。

在我调用EJB3方法之前,我创建了如下的用户事务:

try {
    UserTransaction transaction = (UserTransaction)context.lookup("javax.transaction.UserTransaction");
    transaction.begin();
    // Call EJB3 method
    transaction.commit();
} catch (Throwable t) {
    t.printStackTrace();
    try {
        transaction.rollback();
    } catch (SystemException e) {
        e.printStackTrace();
    }
}

无论提交是否完成,我都想记录。怎么样?

此致

1 个答案:

答案 0 :(得分:0)

交易属性仅在通过代理调用时才相关。它们不适用于直接调用,包括私有方法。尝试类似下面的内容(使用EJB 3.1无接口视图,但如果只有EJB 3.0,则可以创建一个单独的本地接口进行日志记录):

@Stateless
@Local(BusinessInterface.class)
@LocalBean
public class MyBean {
  @EJB MyBean logger;

  @TransactionAttribute(REQUIRED)
  public void businessMethod() {
    try {
      ...
    } catch (Throwable t) {
      logger.logError(t);
      ...
    }
  }

  @TransactionAttribute(NOT_SUPPORTED)
  public void logError(Throwable t) {
    ...
  }
}

重要的一点是,对logError的调用是通过注入的EJB代理进行的,它允许容器控制在logError方法的持续时间内暂停XA事务。