将一个未经检查的异常抛出并捕获到使用spring的@Transactional注释的方法仍会导致事务回滚吗?

时间:2017-09-22 19:50:44

标签: java spring hibernate jpa spring-transactions

我的服务类中有方法。

@Transactional
public void serviceMethod {
    dao.daoMethod();
}

public void daoMethod() {//dao.daoMethod
    //some code
    try {
        //some more code that throws an unchecked exception
    } catch(Exception exception) {
       //do something -- no exceptions generated/thrown from here
    }
    //some more code
 }

这会导致交易回滚吗? 如果从try块中调用的方法中抛出了未经检查的异常,那么它会有什么不同吗?

3 个答案:

答案 0 :(得分:2)

不,只有在未捕获的异常情况下才会回滚事务。

事务拦截器“包围”带注释方法的调用;他们无法看到里面发生了什么

答案 1 :(得分:1)

在你的情况下,它将默默地忽略该异常。你没有在catch块内做任何事情。根本不建议这样做。

答案 2 :(得分:1)

如果你在try-catch块中捕获了一个Exception并且你做了一些操作来处理这个异常 - 就不会发生回滚。在RuntimeException的情况下,默认情况下 - 将发生回滚。

您可以指定哪些异常应该导致回滚。 @Transactional(rollbackFor = MyCheckedException.class)

https://resourcepool.io/2014/11/16/java-quickies-what-you-wish-you-knew-about-spring-transactional-annotation/

https://www.catalysts.cc/wissenswertes/spring-transactional-rollback-on-checked-exceptions/