@@ -598,13 +598,9 @@ public class GlobalExceptionHandler {
598598public enum Isolation {
599599
600600 DEFAULT (TransactionDefinition . ISOLATION_DEFAULT ),
601-
602601 READ_UNCOMMITTED (TransactionDefinition . ISOLATION_READ_UNCOMMITTED ),
603-
604602 READ_COMMITTED (TransactionDefinition . ISOLATION_READ_COMMITTED ),
605-
606603 REPEATABLE_READ (TransactionDefinition . ISOLATION_REPEATABLE_READ ),
607-
608604 SERIALIZABLE (TransactionDefinition . ISOLATION_SERIALIZABLE );
609605
610606 private final int value;
@@ -632,9 +628,29 @@ public enum Isolation {
632628
633629`Exception ` 分为运行时异常 `RuntimeException ` 和非运行时异常。事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。
634630
635- 当 `@Transactional ` 注解作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。如果类或者方法加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。
631+ 当 `@Transactional ` 注解作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。
636632
637- 在 `@Transactional ` 注解中如果不配置`rollbackFor`属性,那么事务只会在遇到`RuntimeException `的时候才会回滚,加上 `rollbackFor= Exception . class`,可以让事务在遇到非运行时异常时也回滚。
633+ `@Transactional ` 注解默认回滚策略是只有在遇到`RuntimeException `(运行时异常) 或者 `Error ` 时才会回滚事务,而不会回滚 `Checked Exception `(受检查异常)。这是因为 Spring 认为`RuntimeException `和 Error 是不可预期的错误,而受检异常是可预期的错误,可以通过业务逻辑来处理。
634+
635+ ! [](https: // oss.javaguide.cn/github/javaguide/system-design/framework/spring/spring-transactional-rollbackfor.png)
636+
637+ 如果想要修改默认的回滚策略,可以使用 `@Transactional ` 注解的 `rollbackFor` 和 `noRollbackFor` 属性来指定哪些异常需要回滚,哪些异常不需要回滚。例如,如果想要让所有的异常都回滚事务,可以使用如下的注解:
638+
639+ ```java
640+ @Transactional (rollbackFor = Exception . class)
641+ public void someMethod() {
642+ // some business logic
643+ }
644+ ```
645+
646+ 如果想要让某些特定的异常不回滚事务,可以使用如下的注解:
647+
648+ ```java
649+ @Transactional (noRollbackFor = CustomException . class)
650+ public void someMethod() {
651+ // some business logic
652+ }
653+ ```
638654
639655## Spring Data JPA
640656
0 commit comments