Spring事务传播机制
时间: 2025-01-29 16:36:04 AIGC 浏览: 75
### Spring 框架中事务传播机制的工作原理
#### 一、事务传播机制概述
在分布式应用环境中,多个业务操作可能涉及不同的服务组件。为了确保数据的一致性和完整性,这些操作通常需要在一个统一的事务上下文中执行。Spring 提供了多种事务传播行为来控制不同方法之间的事务关系。
#### 二、主要传播行为解释
1. **REQUIRED**
如果当前存在事务,则加入该事务;如果不存在事务,则创建一个新的事务。这是最常用的传播行为。当嵌套的方法调用发生异常时,整个事务将会被标记为回滚状态[^3]。
2. **REQUIRES_NEW**
创建新的事务,无论外部是否存在已有事务。新事务独立于原有事务运行,即使内部事务失败也不会影响外层事务的状态。
3. **SUPPORTS**
支持当前事务的存在与否并不强制要求必须有事务环境。如果没有现成的事务则以非事务方式继续执行。
4. **NOT_SUPPORTED**
明确表明不支持事务处理逻辑,暂停任何正在进行中的事务并以无事务模式执行目标方法。
5. **MANDATORY**
要求必须在一个已经存在的事务内执行,否则会抛出 `IllegalTransactionStateException` 异常终止程序流程。
6. **NEVER**
断言当前不应该处于任何活动事务之中,违反此条件同样触发相应的异常响应。
7. **NESTED**
尝试在同一物理事务范围内建立一个子事务结构。只有在外围父级事务成功完成之后才会真正提交所有更改记录。但如果子事务本身出现问题可以单独回退而不干扰上级进程的结果集。
#### 三、配置与使用实例
通过注解形式指定特定的服务类或其成员函数所期望遵循的具体传播策略:
```java
@Service
public class BlogService {
@Autowired
private BlogRepository blogRepo;
// 使用默认 REQUIRED 行为
@Transactional(propagation = Propagation.REQUIRED)
public void addBlogEntry(BlogEntry entry){
try {
blogRepo.save(entry);
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
}
```
对于更复杂的场景下,比如两个相互依赖的服务之间交互时,可以通过调整各自的传播属性达到更好的隔离效果:
```java
@Service
public class AnotherService {
@Autowired
private BlogService blogService;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void performCriticalOperation(){
// 这里定义了一个全新的事务边界
blogService.addBlogEntry(new BlogEntry("Title", "Content"));
// 即使这里发生了错误, 上面保存博客的操作依然会被持久化.
int i = 1 / 0; // 故意制造除零错
}
}
```
阅读全文
相关推荐

















