Java Spring事务在RuntimeException上回滚
我有一个事务方法,我想调用另一个可能引发RuntimeException的方法 问题在于,只有在抛出异常时,事务才会标记为回滚 另一个方法调用本身在try-catch块中,但我认为当另一个方法通过抛出异常返回时,事务会被标记 示例: MyService.java MyUtils.java 编辑: 我不认为这是的重复,因为异常最终被捕获。Java Spring事务在RuntimeException上回滚,java,spring,spring-boot,spring-transactions,Java,Spring,Spring Boot,Spring Transactions,我有一个事务方法,我想调用另一个可能引发RuntimeException的方法 问题在于,只有在抛出异常时,事务才会标记为回滚 另一个方法调用本身在try-catch块中,但我认为当另一个方法通过抛出异常返回时,事务会被标记 示例: MyService.java MyUtils.java 编辑: 我不认为这是的重复,因为异常最终被捕获。 问题可能与此类似,因为它还涉及事务和回滚 注释@Transactional具有参数,例如rollback和no rollback for,您可以使用这些参数判断
问题可能与此类似,因为它还涉及事务和回滚 注释
@Transactional
具有参数,例如rollback
和no rollback for
,您可以使用这些参数判断哪些异常将导致或不会导致回滚。例如,您可以编写:
@Transactional(rollbackFor = {RuntimeException.class})
这将在运行时异常时导致回滚。但是,我认为默认情况下,RuntimeException
会导致回滚。因此,您可能必须在no rollback for
子句中指定此异常。
有关详细信息,请参阅并查找“16.5.5设置””段落Spring事务不取决于行流,它取决于类似的方法如果当前方法中有任何异常,它将回滚必须在try
-catch
块之外发生某些事情。在最后放一个log语句…看看它是否被记录下来-同时你会看到回滚。同意,有些东西闻起来不对劲。该代码应该按您的要求工作。@ChristianMüller不,RuntimeException
也会被try catch
捕获。@Markrottveel我不认为这是标记问题的重复,请参阅我的编辑。为方法上的@Transactional
注释设置norollboor
值将意味着它永远不会在运行时异常上回滚。我想做的是只回滚真正未捕获的RuntimeException
。如果您在标记为@Transactional的方法中捕获了异常,那么该异常不应该影响您的事务行为。在你的方法中一定有其他你没有发现的异常
@Component
public class MyUtils {
// Does not use transactions, repositories
// But I think it inherits the transaction and marks it as rollbackOnly
public void otherPublicMethod() {
// Maybe this is seen as an uncaught exception
throw new RuntimeException();
}
}
@Transactional(rollbackFor = {RuntimeException.class})