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