这是我必须维护的应用程序中遇到的问题:

我有一个带有@Transactional(rollbackFor = CustomExceptionA.class)注释的头等舱
然后在以下代码中,我调用@Transactional(noRollbackFor = CustomExceptionB.class)的方法
注意:CustomExceptionACustomExceptionB只有一个共同祖先是Exception

当然,当我执行代码时,会引发一个异常,它既不是CustomExceptionA也不是CustomExceptionB类型,也不是它们的子类。

所以问题很简单:
在这种情况下,交易会怎样? 是否提交?是否回滚?它是否处于未完成状态,等待应用程序执行某项操作(这实际上是一个答案,可能解释了该应用程序中看到的一些难看的事情)?而且:为什么?

感谢您的帮助和时间。

最佳答案

默认情况下,Spring Framework的事务基础结构代码仅在运行时,未经检查的异常的情况下才将事务标记为回滚。也就是说,当抛出的异常是RuntimeException的实例或子类时。 (默认情况下,错误也会导致回滚。)从事务方法引发的检查异常不会导致事务回滚。

为什么?这完全有道理:检查的异常对于处理或抛出是强制性的,因此,如果将检查的异常从事务方法中抛出,则框架假设您知道自己在做什么。如果发生未阻止的异常,则可能是错误或异常处理缺陷,因此应回滚事务以避免数据损坏。

07-24 21:44