1. 事务传播行为基础概念
在Spring框架中处理数据库操作时,事务传播行为(Transaction Propagation)定义了多个事务方法相互调用时,事务应该如何传递的规则。这就像多人协作完成一个项目时,需要明确各自的工作边界和责任交接方式。
事务传播行为的核心价值在于:
- 解决业务方法嵌套调用时的数据一致性问题
- 提供灵活的事务控制粒度
- 避免不必要的长事务导致性能问题
Spring定义了7种标准传播行为,每种都有特定的使用场景。理解这些行为的关键在于把握两个维度:
- 当前是否存在事务上下文
- 方法调用时指定的传播行为要求
实际开发中最容易混淆的是REQUIRED和REQUIRES_NEW的区别,前者会加入现有事务,后者会挂起当前事务创建新事务。这个选择直接影响异常时的回滚范围。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 七种传播行为详解
2.1 REQUIRED(默认值)
当使用REQUIRED传播行为时:
- 如果当前存在事务,则加入该事务
- 如果当前没有事务,则新建一个事务
这是最常用的传播行为,适合大多数业务场景。比如电商系统中的下单流程:
java复制@Transactional(propagation = Propagation.REQUIRED)
public void placeOrder(Order order) {
// 扣减库存
inventoryService.reduceStock(order);
// 创建订单
orderDao.create(order);
// 支付处理
paymentService.processPayment(order);
}
在这个例子中,如果三个子方法都使用REQUIRED传播行为,它们会在同一个事务中执行。任何一步失败都会导致整个操作回滚。
2.2 REQUIRES_NEW
REQUIRES_NEW的特点是:
- 总是新建一个事务
- 如果当前存在事务,则将其挂起
典型应用场景是日志记录:
java复制@Transactional(propagation = Propagation.REQUIRES_NEW)
public void logOperation(OperationLog log) {
logDao.insert(log);
}
这样即使主业务逻辑失败回滚,操作日志仍然会被保留。但要注意:
- 新建事务会带来额外的数据库连接开销
- 两个事务之间无法共享连接级别的资源(如Hibernate的一级缓存)
2.3 NESTED
NESTED行为创建嵌套事务:
- 如果当前存在事务,则在嵌套事务内执行
- 如果当前没有事务,则表现为REQUIRED
与REQUIRES_NEW的关键区别:
- 嵌套事务使用保存点(Savepoint)实现
- 外层事务
