springboot事务@transactional传播
时间: 2025-07-04 20:22:40 浏览: 0
### Spring Boot 中 `@Transactional` 的事务传播行为
在 Spring Boot 应用程序中,`@Transactional` 是一种声明式的事务管理方式。它允许开发者通过简单的注解来定义事务的行为,而无需手动编写复杂的事务逻辑代码。
#### 1. 什么是事务传播行为?
事务传播行为是指当一个事务方法被另一个事务方法调用时,如何处理这两个事务之间的关系。这种行为由 `@Transactional` 注解中的 `propagation` 属性决定[^2]。
以下是常见的几种事务传播行为及其含义:
#### 2. 常见的事务传播行为
- **REQUIRED**: 如果当前存在事务,则加入该事务;如果不存在则创建一个新的事务。这是默认的传播行为。
- **SUPPORTS**: 如果当前存在事务,则加入该事务;如果不存在,则以非事务的方式继续运行。
- **MANDATORY**: 如果当前存在事务,则加入该事务;如果不存在,则抛出异常。
- **REQUIRES_NEW**: 创建一个新的事务,如果当前存在事务,则将当前事务挂起。
- **NOT_SUPPORTED**: 以非事务方式执行操作,如果当前存在事务,则将当前事务挂起。
- **NEVER**: 以非事务方式执行,如果当前存在事务,则抛出异常。
- **NESTED**: 如果当前存在事务,则在嵌套事务内执行;如果不存在事务,则创建一个新的事务。
每种传播行为都有其特定的应用场景,开发人员应根据业务需求选择合适的传播行为。
#### 3. 示例代码展示不同传播行为的效果
下面是一个基于 Java 和 Spring Boot 的简单示例,展示了不同的事务传播行为效果。
```java
@Service
public class TransactionService {
@Autowired
private AnotherTransactionService anotherTransactionService;
@Transactional(propagation = Propagation.REQUIRED)
public void requiredMethod() {
// 主事务逻辑
System.out.println("Executing REQUIRED method");
anotherTransactionService.supportsMethod();
}
@Transactional(propagation = Propagation.SUPPORTS)
public void supportsMethod() {
// 非独立事务逻辑
System.out.println("Executing SUPPORTS method");
}
}
@Service
class AnotherTransactionService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void requiresNewMethod() {
// 新事务逻辑
System.out.println("Executing REQUIRES_NEW method in a new transaction");
}
}
```
上述代码片段演示了三种不同的事务传播行为:`REQUIRED`, `SUPPORTS`, 和 `REQUIRES_NEW`。其中,`requiredMethod()` 方法会在已有事务上下文中运行,并调用了具有其他传播行为的方法。
#### 4. 同一类内的事务不生效问题
需要注意的是,在同一类内部调用带有 `@Transactional` 注解的方法时,默认情况下不会触发事务机制。这是因为 Spring AOP 使用代理模式实现事务拦截器,而在类内部直接调用方法绕过了代理对象。
解决此问题的一种常见做法是通过自我注入(self-injection),或者重构代码结构使事务边界更加清晰。
---
###
阅读全文
相关推荐


















