1

我想测试事务的自动回滚。因此,我实现了一个简单的 bean[src],它会引发系统异常,这应该会导致自动回滚 [1]。我还实现了SessionSynchronization接口,因此我可以使用afterCompletion方法影响回滚。但是这种方法的论点是正确的,我希望在规范方面是错误的[2]。

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

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


[1]:“回滚容器管理的事务有两种方式。一是如果抛出系统异常,容器会自动回滚事务。二是通过调用EJBContext接口的setRollbackOnly方法,bean方法指示容器回滚事务。如果 bean 抛出应用程序异常,回滚不是自动的,但可以通过调用 setRollbackOnly 来启动。 http://docs.oracle.com/javaee/6/tutorial/doc/bncij.html

[2]:“afterCompletion 方法通知有状态会话 bean 实例事务提交协议已完成,并告诉实例事务是否已提交或回滚。” http://docs.oracle.com/javaee/6/api/javax/ejb/SessionSynchronization.html

[源]:

@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");
  }
}
4

1 回答 1

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,在 Statefull bean 上调用 remove() 时会报告类似的问题,请参阅此处。当我尝试抛出 RuntimeException 时,我收到了相同的错误消息。我认为它已在 Verion 7.1.3 中修复。但我没有测试过自己。

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

@ApplicationException(rollback=true)

麦迪

于 2012-10-12T15:19:04.540 回答