我想测试事务的自动回滚。因此,我实现了一个简单的 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");
}
}