Spring Transaction:rollbackfor和norollbackfor都定义了

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

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

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

所以问题很简单: 在这种情况下交易会发生什么? 它承诺了吗? 它会回滚吗? 它是否保持未完成状态等待应用程序执行某些操作(这实际上是一个可以解释此应用程序中看到的一些丑陋事情的答案)? 而且: 为什么?

谢谢你的帮助和时间。

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

为什么? 这非常有意义:已检查的exception对于处理或丢弃是强制性的,因此如果您将已检查的exception从事务方法中抛出,那么框架会假设您知道自己在做什么。 如果未解决的例外情况可能是错误或exception处理缺陷,那么事务将被回滚以避免数据损坏。