@Transactional内部嵌套方法
时间: 2024-07-06 17:01:31 浏览: 77
@Transactional 注解是 Spring 框架中的一个特性,用于控制事务处理,当它被应用到方法或类上时,Spring 容器会自动管理该方法或类中所有符合特定规则的方法的事务。如果你在一个方法中使用了 @Transactional 并且这个方法又调用了其他方法,Spring 会根据一些规则来决定如何处理这些内部调用的方法:
1. 如果内部方法上也标注了 @Transactional,那么有两种行为:
- `propagation = DEFAULT` 或未指定 propagation 属性(默认):默认情况下,Spring 会选择传播行为(Propagation)。这取决于外部方法的事务状态,如果外部方法在一个事务中,则内部方法也在该事务中执行;如果外部方法没有事务,那么内部方法将开始一个新的事务。
- `propagation = REQUIRES_NEW`:表示内部方法总是开始一个新的事务,即使外部方法已经在一个事务中。
2. 如果内部方法没有 @Transactional 标注,Spring 会根据 `propagation` 属性的设置来决定是否为它们开启事务:
- 如果 propagation 设置为 `REQUIRED`,内部方法会在外部方法的事务上下文中执行,如果没有外部事务则新建一个。
- 对于其他传播行为如 `NEVER`, `NOT_SUPPORTED`, `MANDATORY`,它们有自己的特定规则,比如 `NEVER` 表示内部方法不会有自己的事务。
3. 如果内部方法是一个静态方法,那么 @Transactional 无效,因为静态方法不关联任何实例,无法参与到事务中。
相关问题:
1. 在哪些情况下,Spring 会自动回滚内部方法的事务?
2. 如何避免在 @Transactional 方法内部调用其他方法时引发事务嵌套过深的问题?
3. `propagation` 属性有哪些可选值,它们分别代表什么意思?
阅读全文