JavaEE6(使用JBoss7):自动回滚事务

JavaEE6(使用JBoss7):自动回滚事务,jboss,java-ee-6,jboss7.x,Jboss,Java Ee 6,Jboss7.x,我想测试事务的自动回滚。因此,我实现了一个简单的bean[src],它抛出一个系统异常,该异常将导致自动回滚[1]。我还实现了接口SessionSynchronization,以便在完成后使用该方法影响回滚。但是这种方法的论点是真的,我认为就规范而言,假的[2] 我是否遗漏了什么,或者这是JBoss7中的一个bug?我已经搜索了bug追踪器,但没有找到任何东西。。。也许我用错词了 如果这不是错误:如果发生系统或应用程序异常,是否有关于将afterCompletion参数设置为false的任何设置

我想测试事务的自动回滚。因此,我实现了一个简单的bean[src],它抛出一个系统异常,该异常将导致自动回滚[1]。我还实现了接口SessionSynchronization,以便在完成后使用该方法影响回滚。但是这种方法的论点是真的,我认为就规范而言,假的[2]

我是否遗漏了什么,或者这是JBoss7中的一个bug?我已经搜索了bug追踪器,但没有找到任何东西。。。也许我用错词了

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


[1] :“有两种方法可以回滚容器管理的事务。首先,如果抛出系统异常,容器将自动回滚事务。其次,通过调用EJBContext接口的setRollbackOnly方法,bean方法指示容器回滚事务。如果bean抛出应用程序异常,回滚不是自动的,但可以通过调用setRollbackOnly来启动。”

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

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

有两个例外

org.omg.CORBA.SystemException  subclass of RuntimeException
javax.transaction.SystemException subclass of Exception
我希望您使用的是org.omg.CORBA.SystemException

EJB3.1规范指出,如果事务的RuntimeException或ApplicationException发生异常,则需要回滚事务

据我所见,AppCationException在JBoss 7.1.1中得到了正确的处理,但没有RuntimeException

对于RuntimeException,当对Statefull bean、reference调用remove()时,报告了一个类似的问题。当我尝试抛出RuntimeException时,我收到了相同的错误消息。我认为它在Verion 7.1.3中得到了修复。但我还没有测试自己

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

@ApplicationException(rollback=true)

Maddy

谢谢你的回复!你测试过RuntimeException处理吗?还是基于remove()问题的建议?ApplicationException(rollback=true)注释工作正常。我测试了两者。结果就是我发布的。