7

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

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

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

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

4

1 回答 1

13

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

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

于 2013-08-13T08:16:57.507 回答