当前位置: 首页 > news >正文

spring传播机制事务相关

一、REQUIRED 核心规则(一句话记住)

有则加入,无则新建

完整严谨描述:
 
  1. 当一个被 @Transactional 标记的目标方法执行时,先检查当前执行环境是否已经存在事务;
  2. 如果当前已有事务 → 该方法不会新建事务,而是加入到这个已存在的事务中,成为「同一个事务」的一部分;
  3. 如果当前没有事务 → 该方法就自己新建一个全新的独立事务来执行。

二、准备基础测试代码(通用)

为了让示例直观,我们定义一个业务 Service,包含 2 个带事务的「子方法」,模拟数据库的增删改操作(事务只对增删改生效,查询无意义),所有方法抛出的是RuntimeException(Spring 事务默认只对运行时异常回滚,贴合实际开发)。

1. 核心业务 Service

java
 
运行
 
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class OrderService {// 事务方法1:模拟【创建订单】操作,带默认事务(REQUIRED)@Transactional // 等价于 @Transactional(propagation = Propagation.REQUIRED)public void createOrder() {System.out.println("执行逻辑:向数据库插入【订单】数据");// 这里可以写真实的 mapper.insert(订单对象)}// 事务方法2:模拟【扣减库存】操作,带默认事务(REQUIRED)@Transactionalpublic void deductStock() {System.out.println("执行逻辑:修改数据库的【商品库存】数据");// 这里可以写真实的 mapper.update(库存对象)// 手动抛出运行时异常,模拟业务执行失败throw new RuntimeException("扣减库存失败!库存不足");}
}

2. 补充说明

 
  • 两个方法都加了@Transactional,都是默认的REQUIRED传播机制;
  • deductStock() 方法中手动抛出异常,用于模拟「业务执行失败」的场景,验证事务的回滚规则;
  • 真实开发中,这里就是调用 Mapper/DAO 层操作数据库,效果完全一致。

 

三、场景一:外层方法【无事务】,调用内层事务方法 ✅ 无则新建

 
这是 REQUIRED 规则的第一种情况:当前执行环境无事务 → 内层方法各自新建独立事务。
 

1. 新增「无事务的外层方法」

 
在上面的OrderService中新增一个不加任何事务注解的方法,用来调用两个事务子方法:
 
java
 
运行
 
// 无事务的外层方法:没有@Transactional注解
public void doBizWithoutTx() {// 调用第一个事务方法this.createOrder();// 调用第二个事务方法(会抛异常)this.deductStock();
}

2. 执行结果 + 事务分析

调用 doBizWithoutTx() 方法后,最终执行结果:
✅ 数据库中,订单数据插入成功,库存数据无修改(扣减库存回滚)
核心分析(重中之重):
  1. 外层方法doBizWithoutTx() 无事务,执行时「当前无事务环境」;
  2. 调用createOrder()时 → 无事务,触发REQUIRED → 新建独立事务 A,执行完订单插入后,事务 A 正常提交;
  3. 调用deductStock()时 → 无事务,触发REQUIRED → 新建独立事务 B,执行库存扣减后抛出异常,事务 B 触发回滚;
  4. 结论:两个事务方法各自是独立的事务,互不影响!一个成功提交,一个失败回滚。

四、场景二:外层方法【有事务】,调用内层事务方法 ✅ 有则加入(重点 + 高频)

这是 REQUIRED 规则的第二种情况,也是实际开发中最常用的场景:当前执行环境有事务 → 内层方法加入外层事务,成为同一个事务。

1. 新增「有事务的外层方法」

OrderService中新增一个加了 @Transactional的外层方法,同样调用两个事务子方法:
java
运行
// 有事务的外层方法:自己带默认事务(REQUIRED)
@Transactional
public void doBizWithTx() {// 调用第一个事务方法this.createOrder();// 调用第二个事务方法(会抛异常)this.deductStock();
}

2. 执行结果 + 事务分析

调用 doBizWithTx() 方法后,最终执行结果:
 
✅ 数据库中,订单数据无插入、库存数据无修改,两个操作全部回滚!
 
核心分析(必须吃透):
 
  1. 外层方法doBizWithTx() 加了@Transactional,执行时先新建了一个「主事务 T」;
  2. 调用createOrder()时 → 当前已有事务 T,触发REQUIRED → 不新建事务,直接加入主事务 T,订单插入逻辑成为事务 T 的一部分;
  3. 调用deductStock()时 → 当前已有事务 T,触发REQUIRED → 不新建事务,直接加入主事务 T,库存扣减逻辑也成为事务 T 的一部分;
  4. deductStock()抛出异常 → 整个「主事务 T」触发回滚,事务内的所有操作都会回滚(包括之前执行的 createOrder 的订单插入);
  5. 结论:外层有事务时,所有内层的 REQUIRED 事务方法,都会合并成一个事务,要么全部成功,要么全部失败回滚!

五、补充 2 个关键知识点(面试 / 开发高频)

✅ 知识点 1:同一个事务的核心特性

当多个方法「加入到同一个事务」时,它们共享同一个事务的所有属性:
  • 事务的隔离级别、超时时间、只读属性等,都和外层主事务一致;
  • 事务的提交 / 回滚是全局的:只有所有方法都执行成功,事务才会最终提交;只要有任意一个方法抛出异常触发回滚,整个事务全部回滚。

✅ 知识点 2:REQUIRED 是 Spring 的默认选择,为什么?

Spring 把REQUIRED作为默认传播机制,是因为它完美贴合 99% 的业务场景:
实际开发中,我们的业务逻辑都是「组合操作」(比如:下单 = 创建订单 + 扣减库存 + 扣减余额),这些操作必须是原子性的(要么都成,要么都败),否则会出现「数据不一致」的脏数据(比如:订单创建成功,但库存没扣减,商品超卖)。
REQUIRED的机制刚好满足这个需求,这也是它成为默认值的核心原因。

总结(核心要点,一句话总结所有)

  1. Spring 事务默认传播机制:Propagation.REQUIRED,口诀「有则加入,无则新建」;
  2. 外层无事务 → 内层事务方法各自独立,一个失败不影响另一个;
  3. 外层有事务 → 内层事务方法全部合并为同一个事务,一荣俱荣,一损俱损;
  4. 这是 Spring 最核心、最常用的事务传播机制,99% 的业务开发都用它足够。
http://www.jsqmd.com/news/262524/

相关文章:

  • 7.1 NL2SQL核心技术:让AI听懂你的自然语言查询
  • 有人吃NMN像换了个人,有人却没啥变化!盼生派带你搞懂NMN真相 - 速递信息
  • AI 写论文哪个软件最好?实测虎贲等考 AI:毕业论文的智能通关密码
  • 云数潮:每天三分钟,让普通人参与数字经济 - 速递信息
  • 毕业生必看:论文AI率太高被退回?5招搞定降AI全攻略 - 还在做实验的师兄
  • 虎贲等考 AI:重塑学术写作范式的智能全流程解决方案
  • bind接口的address详解
  • Kimi写的内容AI率太高?这几款工具帮你降到10%以下 - 还在做实验的师兄
  • 端口的本质是什么
  • 聊聊2026年果汁生产线资深厂商,上望机械制造靠谱吗? - 工业品牌热点
  • Kimi降AI效果怎么样?月之暗面AI助手降论文AI率实测 - 还在做实验的师兄
  • 告别绘图加班!虎贲等考 AI 科研绘图:让数据秒变期刊级高颜值图表
  • 数值方法验证: 制造解方法(Method of Manufactured Solutions,MMS)介绍
  • 10 分钟搞定学术 PPT!虎贲等考 AI PPT:逻辑与颜值双在线的汇报神器
  • 8.3 DICOM数据处理:医疗影像预处理全流程
  • 全自动制袋机制造企业选择哪家好?靠谱的厂家排名情况如何? - 工业品牌热点
  • 8.4 智能诊断报告:从影像到文本的跨模态生成
  • 查重 AIGC 双杀!虎贲等考 AI 让论文改写告别 “机器味” 与高重复率
  • 9.1 分布式训练三剑客:DP、MP、PP并行策略详解
  • 课程论文不用愁!虎贲等考 AI 一键解锁高分学术捷径
  • 测水流量计怎么挑?2026年实力厂家质量对比,圆缺孔板/醇类流量计/超声波流量计,测水流量计供应厂家排名 - 品牌推荐师
  • 5 款 AI 写论文哪个好?实测避雷!虎贲等考 AI 凭硬核实力稳坐头把交椅
  • 3步搞定论文AIGC检测,从70%降到10%以下的完整方案 - 还在做实验的师兄
  • FFmpeg开发笔记(一百)国产的Android开源视频压缩工具VideoSlimmer
  • 学霸同款2026 TOP10 AI论文平台:自考毕业论文写作全测评
  • 实用指南:粒子群优化算法求解三维变换矩阵的数学推导
  • d1
  • 3步搞定论文降AI:从检测到修改的完整流程 - 还在做实验的师兄
  • 智慧校园之学生课堂场景行为识别 教育场景智能分析系统 学生行为监测算法优化 学生玩手机识别 上课走神识别 yolo26格式数据集第10407期
  • DeepSeek降AI效果实测:免费方案真的能用吗? - 还在做实验的师兄