事务传播类型 required
时间: 2024-12-30 16:25:09 浏览: 10
### Spring 事务传播行为 REQUIRED 的工作原理
当一个方法被声明为 `REQUIRED` 时,它会检查当前是否存在一个活动的事务。如果存在事务,则该方法将加入到现有事务中执行;如果没有现成的事务,则会创建一个新的事务来执行此方法[^2]。
#### 使用场景
- **已有事务的情况**:假设服务层 A 方法正在某个事务 T1 中运行,在其内部调用了同样配置了 `REQUIRED` 属性的服务 B 方法。此时由于 T1 已经存在,B 将直接参与 T1 而不是重新创建新事务。
- **无事务的情况下**:假如没有任何正在进行中的事务,那么标记有 `REQUIRED` 的业务逻辑就会触发一个新的事务开始,并在其完成之后结束这个事务。
#### 示例代码展示
下面是一个简单的例子展示了如何定义以及使用带有 `REQUIRED` 传播属性的方法:
```java
@Service
public class MyService {
@Transactional(propagation = Propagation.REQUIRED)
public void outerMethod() {
try {
innerMethod();
} catch (Exception e) {
System.out.println("Outer method caught exception");
throw new RuntimeException(e);
}
}
@Transactional(propagation = Propagation.REQUIRED)
private void innerMethod() throws Exception {
// Some business logic here...
if (someCondition()) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // 设置回滚状态
throw new Exception("Simulated error occurred.");
}
}
}
```
在这个案例里,无论是在 `outerMethod()` 还是 `innerMethod()` 上都应用了相同的 `@Transactional` 注解,默认情况下它们都将遵循 `REQUIRED` 行为模式。因此,这两个方法会在同一个事务上下文中操作数据库资源,除非发生异常导致其中一个方法显式请求回滚整个事务[^3]。
阅读全文