【问题标题】:Do NOT let transaction rollback for a particular type of RuntimeException不要让特定类型的 RuntimeException 的事务回滚
【发布时间】:2020-03-04 04:57:44
【问题描述】:

您好,有没有办法在我抛出特定类型的 RuntimeException 后让 spring 事务不回滚?

我有一个名为 CustomException 的类扩展了 RuntimeException,我想在抛出它之前做某事。但是由于回滚,doSth() 所做的一切都会回滚。

doSth();
throw new CustomException();

我可以通过将 CustomException 从扩展 RuntimeException 更改为 Exception 来管理它,以便它成为一个检查异常。

但是,在这样做之后,我必须将throws CustomException 添加到将调用此代码块的所有方法中。所以只是想知道是否有更优雅的方式

【问题讨论】:

  • doSth() 是否属于同一类?如果我正确理解您的问题,从异常更改为扩展也会导致回滚
  • 是的,它属于同一类。通过从 Exception 扩展并使其成为已检查的异常,回滚不应该再发生,因为我相信默认情况下只有 spring 回滚 RuntimeExceptino
  • 确实如此。最初,您从 RuntimeException 扩展,这让我认为发生异常情况时需要回滚。如果在你的情况下,不需要回滚,但异常应该传播回来,来自 Niraj Jha 的解决方案应该可以工作。如果这不是您所需要的,您能否相应地更新问题?
  • 您的意思是如果我从 RuntimeException 扩展,那么 Niraj 的方法将不起作用?但是它对我有用。你能提供更多解释吗?我真的不需要异常来传播回来,这就是为什么我想通过使用 Niraj 的方式继续从 RuntimeException 扩展
  • Niraj 的解决方案可行。我知道您的要求是对异常的回滚,并且只有来自 doSth() 的更改应该持续存在。这样从 RuntimeException 更改为 Exception 并且仍然进行回滚也会导致 doSth() 不持久。我的评论是关于那个背景的。希望这可以澄清

标签: spring spring-transactions runtimeexception


【解决方案1】:

您应该使用@Transactional 的noRollbackFor 属性。

@Transactional(noRollbackFor = customException.class) 

【讨论】:

  • 是的,已经尝试过了。我知道属性“rollbackFor”,应该想到这一点。谢谢@Niraj
  • 欢迎,请不要忘记查看任何注释的所有属性,这真的很有帮助。
猜你喜欢
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多