Propagation.REQUIRED:默认的事务传播级别,它表示如果当前存在事务,则加⼊该事务;如果当前没有事务,则创建⼀个新的事务。 Propagation.SUPPORTS:如果当前存在事务,则加⼊该事务;如果当前没有事务,则以⾮事务的⽅式继续运⾏。 Propagation.MANDATORY:(mandatory:强制性)如果当前存在事务,则加⼊该事务;如果当前没有事务,则抛出异常。 Propagation.REQUIRES_NEW:表示创建⼀个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部⽅法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部⽅法会新开启⾃⼰的事务,且开启的事务相互独⽴,互不⼲扰。 Propagation.NOT_SUPPORTED:以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起。 Propagation.NEVER:以⾮事务⽅式运⾏,如果当前存在事务,则抛出异常。 Propagation.NESTED:如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏;如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED。
时间: 2025-06-04 22:17:19 浏览: 11
### Spring事务传播行为的定义和区别
Spring事务传播行为定义了事务在方法调用时的行为方式,主要通过`@Transactional`注解中的`propagation`属性进行配置。以下是各传播行为的定义、区别和用法:
#### 1. **Propagation.REQUIRED**
- 如果当前存在事务,则加入该事务;如果不存在事务,则创建一个新的事务。
- 这是默认的传播行为。
- **适用场景**:大多数情况下使用,确保方法运行在一个事务中。
- 示例代码:
```java
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 方法逻辑
}
```
[^1]
#### 2. **Propagation.SUPPORTS**
- 如果当前存在事务,则加入该事务;如果不存在事务,则以非事务方式执行。
- 不会创建新的事务。
- **适用场景**:用于读取操作,不强制要求事务支持。
- 示例代码:
```java
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
// 方法逻辑
}
```
[^1]
#### 3. **Propagation.MANDATORY**
- 必须在一个已有的事务中执行,否则抛出异常。
- **适用场景**:适用于必须在事务上下文中执行的操作。
- 示例代码:
```java
@Transactional(propagation = Propagation.MANDATORY)
public void methodC() {
// 方法逻辑
}
```
[^1]
#### 4. **Propagation.REQUIRES_NEW**
- 无论当前是否存在事务,都会创建一个新的事务。原有事务将被挂起,新事务执行完毕后继续原事务。
- 使用此传播机制的好处是可以将方法的执行独立于当前事务,避免与现有事务发生冲突。
- **适用场景**:需要独立事务执行的情况,例如敏感操作或避免潜在死锁问题。
- 示例代码:
```java
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodD() {
// 方法逻辑
}
```
[^2][^5]
#### 5. **Propagation.NOT_SUPPORTED**
- 容器不会为该方法开启事务。如果当前存在事务,事务将被挂起。
- **适用场景**:不需要事务支持的操作。
- 示例代码:
```java
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodE() {
// 方法逻辑
}
```
#### 6. **Propagation.NEVER**
- 必须在一个没有事务的环境中执行,否则抛出异常。
- **适用场景**:确保某些操作不在事务中执行。
- 示例代码:
```java
@Transactional(propagation = Propagation.NEVER)
public void methodF() {
// 方法逻辑
}
```
#### 7. **Propagation.NESTED**
- 如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则进行与`Propagation.REQUIRED`类似的操作。
- 嵌套事务是外部事务的子事务,其提交或回滚依赖于外部事务。
- **适用场景**:需要保存点(savepoint)的功能,允许部分事务回滚而不影响整个事务。
- 示例代码:
```java
@Transactional(propagation = Propagation.NESTED)
public void methodG() {
// 方法逻辑
}
```
[^3][^4]
---
### 总结表格
| 传播行为 | 当前有事务 | 当前无事务 | 特性描述 |
|--------------------|---------------------|-----------------------|--------------------------------------------------------------------------|
| REQUIRED | 加入事务 | 创建新事务 | 默认行为,确保方法运行在一个事务中。 |
| SUPPORTS | 加入事务 | 非事务方式执行 | 不强制要求事务支持。 |
| MANDATORY | 加入事务 | 抛出异常 | 必须在一个已有的事务中执行。 |
| REQUIRES_NEW | 挂起原事务,新建事务 | 新建事务 | 独立事务执行,避免与现有事务冲突。 |
| NOT_SUPPORTED | 挂起事务,非事务执行 | 非事务方式执行 | 不需要事务支持的操作。 |
| NEVER | 抛出异常 | 非事务方式执行 | 确保某些操作不在事务中执行。 |
| NESTED | 嵌套事务执行 | 创建新事务 | 子事务依赖外部事务的提交或回滚状态。 |
---
### 注意事项
- 在选择传播行为时,需根据业务需求合理配置,避免不必要的事务开销。
- `REQUIRES_NEW` 和 `NESTED` 的主要区别在于前者是一个完全独立的新事务,而后者是外部事务的子事务。
---
阅读全文
相关推荐


















