Java EE 6(使用JBoss 7):自动回滚事务

时间:2012-10-12 11:50:19

标签: jboss java-ee-6 jboss7.x

我想测试自动回滚事务。因此,我实现了一个简单的bean [src],它会抛出一个系统异常,导致自动回滚[1]。我还实现了接口 SessionSynchronization ,因此我可以使用方法 afterCompletion 来影响回滚。但是这个方法的论点是 true ,对于specs [2],我希望它是 false

我错过了什么或者这是JBoss 7中的错误吗?我已经搜索了bug跟踪器,但没有找到任何东西......也许我用了错误的单词?

如果这不是错误:如果发生系统或应用程序异常,是否有关于将 afterCompletion 参数设置为false的设置?


[1]:“有两种方法可以回滚容器管理的事务。首先,如果抛出系统异常,容器将自动回滚事务。其次,通过调用setRollbackOnly方法在EJBContext接口中,bean方法指示容器回滚事务。如果bean抛出应用程序异常,则回滚不是自动的,而是可以通过调用setRollbackOnly来启动。“ http://docs.oracle.com/javaee/6/tutorial/doc/bncij.html < / p>

[2]:“afterCompletion方法通知有状态会话bean实例事务提交协议已完成,并告诉实例事务是否已提交或回滚。” {{3 }}

[SRC]:

@Stateful
@LocalBean
public class RollbackTestBean implements RollbackTest, SessionSynchronization {

  int counter = 0;
  int counterBuffer = 0;
  private final Logger logger = Logger.getLogger(this.getClass().getName());

  @Override
  public int getCounter() {
    return counter;
  }

  @Override
  public void throwSystemException() throws SystemException {
    counter++;
    throw new SystemException();
  }

  @Override
  public void afterBegin() throws EJBException, RemoteException {
    logger.info("[TX]: after begin");
    counterBuffer = counter;
  }

  @Override
  public void afterCompletion(boolean success) throws EJBException, RemoteException {
    logger.info("[TX]: after completion: " + success);
    if (!success)
      counter = counterBuffer;
  }

  @Override
  public void beforeCompletion() throws EJBException, RemoteException {
    logger.info("[TX]: before completion");
  }
}

1 个答案:

答案 0 :(得分:2)

有两个SystemExceptions

org.omg.CORBA.SystemException  subclass of RuntimeException
javax.transaction.SystemException subclass of Exception

我希望您使用的是org.omg.CORBA.SystemException

EJB3.1规范说,如果它的RuntimeException或ApplicationException,则需要回滚事务。

据我所知,ApplcationException在JBoss 7.1.1中正确处理,但不是RuntimeException。

使用RuntimeException时,在状态bean(引用here)上调用remove()时会报告类似的问题。我尝试抛出RuntimeException时收到相同的错误消息。我认为它固定在Verion 7.1.3中。但我没有测试过自己。

如果您正在寻找修复,可以尝试7.1.3。如果您有异常并想要事务回滚,请使用

@ApplicationException(rollback=true)

麦迪