【发布时间】: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