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