【问题标题】:ejb3 isolated (autonomous) transaction inside session bean会话 bean 内的 ejb3 隔离(自治)事务
【发布时间】:2012-05-23 10:44:49
【问题描述】:

我正在使用 XA(2 阶段)事务。我想通过日志类和实体管理器登录到一个日志表。我在 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();
    }
}

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

问候

【问题讨论】:

    标签: java transactions ejb transaction-isolation


    【解决方案1】:

    事务属性仅在通过代理调用时才相关。它们不适用于直接调用,其中包括私有方法。尝试以下类似的方法(它使用 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 事务。

    【讨论】:

    • 是的。但是在方法 logError 中,无论用户(来自 XA 事务)是否提交或回滚所有内容,我都想“提交”数据。我已经尝试过了,但是没有用……在 logError 中我确实坚持(),然后是刷新()。但没有运气。 10x
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    相关资源
    最近更新 更多