在无状态EJB中的JTA环境中执行手动回滚

时间:2014-03-19 19:42:58

标签: java jpa ejb jta

我开发了注册功能。将在数据库中创建一个新的用户帐户,之后将发送欢迎电子邮件。电子邮件发送功能可以执行一个例外。如果抛出异常,则必须删除创建的用户帐户。问题是只有在抛出未经检查的异常时,我的无状态bean才会回滚。我的例外是检查异常。要么我必须包装一个未经检查的异常,然后我不能使用正确的http状态代码(使用jax rs)进行响应,或者我必须执行手动回滚。

有人可以为我的方案提供帮助并提供更好的解决方案吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以使用annotation注释已检查的异常:@ApplicationException(rollback = true)。

例如:

@ApplicationException(rollback = true)
public class MyApplicationException extends Exception{
}

这将标记当前事务以进行回滚。

修改

  

我不想使用异常来执行回滚,因为我无法使用http状态代码进行响应

其他替代方法是使用SessionContext.setRollbackOnly()方法显式标记回滚事务。我不知道你的应用程序设计,但一个例子是:

@Stateless
public class MyBean(){

    @Resource
    private SessionContext ctx;

    public void doSomething() {
        try {
            //code that sends a mail
        } catch (Exception e) {
            ctx.setRollbackOnly(); //the transaction will not commit
           //log exception

        }
    }
 }