diff --git a/docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md b/docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md index 53c11444..7492ac3b 100644 --- a/docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md +++ b/docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md @@ -598,13 +598,9 @@ public class GlobalExceptionHandler { public enum Isolation { DEFAULT(TransactionDefinition.ISOLATION_DEFAULT), - READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED), - READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED), - REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ), - SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE); private final int value; @@ -632,9 +628,29 @@ public enum Isolation { `Exception` 分为运行时异常 `RuntimeException` 和非运行时异常。事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。 -当 `@Transactional` 注解作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。如果类或者方法加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。 +当 `@Transactional` 注解作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。 -在 `@Transactional` 注解中如果不配置`rollbackFor`属性,那么事务只会在遇到`RuntimeException`的时候才会回滚,加上 `rollbackFor=Exception.class`,可以让事务在遇到非运行时异常时也回滚。 +`@Transactional` 注解默认回滚策略是只有在遇到`RuntimeException`(运行时异常) 或者 `Error` 时才会回滚事务,而不会回滚 `Checked Exception`(受检查异常)。这是因为 Spring 认为`RuntimeException`和 Error 是不可预期的错误,而受检异常是可预期的错误,可以通过业务逻辑来处理。 + +![](https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/spring-transactional-rollbackfor.png) + +如果想要修改默认的回滚策略,可以使用 `@Transactional` 注解的 `rollbackFor` 和 `noRollbackFor` 属性来指定哪些异常需要回滚,哪些异常不需要回滚。例如,如果想要让所有的异常都回滚事务,可以使用如下的注解: + +```java +@Transactional(rollbackFor = Exception.class) +public void someMethod() { +// some business logic +} +``` + +如果想要让某些特定的异常不回滚事务,可以使用如下的注解: + +```java +@Transactional(noRollbackFor = CustomException.class) +public void someMethod() { +// some business logic +} +``` ## Spring Data JPA