2017-09-22 178 views
1

我在我的服务类中有方法。在Spring的@Transactional注解的方法中引发和未捕获的未经检查的异常是否仍会导致事务回滚?

@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块中调用的方法中抛出Unchecked异常,它会有什么不同吗?

回答

2

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

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

+1

嘿Haroldo, 感谢您的回答,以及它背后的解释。我会深入研究它。 – sarkardebanjan

1

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

+0

Hey Yohannes。感谢您的回答。出于法律原因,我不能把实际的代码放在这里,但实际上我将记录审计和未来行动的例外情况,并期望从那里不会有例外。 – sarkardebanjan

+0

仅当抛出的异常是未经检查的异常时,事务才会回滚。而且,在你的catch块内部,请在你的日志消息之后抛出未经检查的异常,以便在发生未经检查的异常时进行回滚。看看这个https://www.catalysts.cc/en/wissenswertes/spring-transactional-rollback-on-checked-exceptions/。 –

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/

+0

Hey Merkurev, 感谢您的联系。真的很感谢帮助。 – sarkardebanjan

相关问题