spring传播机制事务supports

一、SUPPORTS 核心定义(必记)

1. 注解写法(必须手动指定,非默认)

 
java
 
运行
@Transactional(propagation = Propagation.SUPPORTS)

2. 极简口诀(和REQUIRED对比记忆,一辈子不忘)

  • REQUIRED:有则加入,无则新建(无事务时主动创建事务)
  • SUPPORTS:有则加入,无则无事务(无事务时就「裸奔」执行,不创建任何事务)

3. 完整严谨规则

当被@Transactional(propagation=SUPPORTS)标记的方法执行时:
  1. 检查当前执行环境是否存在事务;
  2. ✔️ 如果当前已有事务 → 该方法加入到这个已存在的事务中,成为事务的一部分(和REQUIRED这一步的行为完全一致);
  3. ✔️ 如果当前没有事务 → 该方法不会新建任何事务,直接以「无事务」的方式执行代码;

✅ 二、REQUIRED vs SUPPORTS 核心对比(重中之重,一张表看懂)

 
这是两个传播机制的唯一区别,也是核心考点,一定要吃透:
 
传播机制有事务时行为无事务时行为核心特点
REQUIRED(默认) 加入已有事务 新建事务执行 「强制性」事务,一定有事务包裹
SUPPORTS 加入已有事务 无事务执行 「支持性」事务,有没有事务都能执行,随外层环境而定
 
💡 关键结论:两者仅在「外层无事务」时行为不同,外层有事务时行为完全一样!

✅ 三、准备测试代码(复用你熟悉的结构,无冗余)

和上一节REQUIRED的示例完全复用,仅修改事务传播机制,降低理解成本,所有规则完全贴合真实开发:
 
  1. 两个核心方法,都标记为SUPPORTS传播机制;
  2. deductStock() 依然手动抛出RuntimeException,模拟业务执行失败,用于验证事务回滚规则;
  3. 事务只对增 / 删 / 改数据库操作生效,查询方法无事务意义,这里依然用「创建订单 + 扣减库存」模拟真实业务。
java
运行
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;@Service
public class OrderService {// 事务方法1:创建订单,SUPPORTS传播机制@Transactional(propagation = Propagation.SUPPORTS)public void createOrder() {System.out.println("执行逻辑:向数据库插入【订单】数据");// 真实代码:mapper.insert(order);}// 事务方法2:扣减库存,SUPPORTS传播机制 + 模拟异常@Transactional(propagation = Propagation.SUPPORTS)public void deductStock() {System.out.println("执行逻辑:修改数据库的【商品库存】数据");// 真实代码:mapper.update(stock);throw new RuntimeException("扣减库存失败!库存不足"); // 手动抛异常}
}

✅ 四、场景一:外层方法【无事务】,调用SUPPORTS内层方法(核心差异场景)

 
这是SUPPORTSREQUIRED唯一不一样的场景,也是SUPPORTS的核心特性,开发中 90% 的坑都在这里!
 

1. 新增无事务外层方法

java
运行
 
// 无事务的外层方法:无任何@Transactional注解
public void doBizWithoutTx() {this.createOrder(); // 调用SUPPORTS方法this.deductStock(); // 调用SUPPORTS方法(抛异常)
}

2. 执行结果 + 事务深度分析

✅ 最终结果:数据库中「订单数据插入成功」、「库存扣减操作执行了但抛异常」,两个操作都不会回滚!
 
✅ 核心分析(逐行拆解,必须看懂):
  1. 外层方法无事务,执行环境「无事务」;
  2. 调用createOrder()(SUPPORTS)→ 无事务 → 无事务执行,数据库操作是「自动提交」模式,订单插入后立刻写入数据库,没有事务保护;
  3. 调用deductStock()(SUPPORTS)→ 无事务 → 无事务执行,库存扣减的 SQL 先执行,然后抛出异常;
  4. ⚠️ 关键坑点:无事务环境下,抛出任何异常都不会触发回滚!因为回滚是「事务的能力」,没有事务,数据库操作执行后就直接提交了,无法回滚。

✅ 和 REQUIRED 的对比(必看)

同样是「外层无事务」的场景:
  • REQUIRED:两个方法会各自新建独立事务,一个成功提交、一个失败回滚;
  • SUPPORTS:两个方法无事务执行,全部自动提交,抛异常也不会回滚;

✅ 五、场景二:外层方法【有事务】,调用SUPPORTS内层方法(行为一致场景)

 
这是SUPPORTSREQUIRED完全相同的场景,也是SUPPORTS的核心价值所在,务必记住:外层有事务时,SUPPORTS = REQUIRED!
 

1. 新增有事务外层方法

java
 
运行
 
// 有事务的外层方法:默认REQUIRED传播机制
@Transactional
public void doBizWithTx() {this.createOrder(); // 调用SUPPORTS方法this.deductStock(); // 调用SUPPORTS方法(抛异常)
}

2. 执行结果 + 事务深度分析

✅ 最终结果:数据库中「订单无插入、库存无修改」,两个操作全部回滚!
 
✅ 核心分析(和 REQUIRED 一模一样):
 
  1. 外层方法加了@Transactional,执行时新建了一个主事务 T;
  2. 调用createOrder()(SUPPORTS)→ 当前有事务 T → 加入主事务 T,订单插入成为事务的一部分;
  3. 调用deductStock()(SUPPORTS)→ 当前有事务 T → 加入主事务 T,库存扣减也成为事务的一部分;
  4. 方法抛出异常后,整个主事务 T 全局回滚,事务内所有操作全部撤销;

✅ 六、SUPPORTS 避坑 3 个核心注意事项(开发必看,高频踩坑)

⚠️ 注意 1:无事务时,任何异常都不会触发回滚(重中之重)

这是SUPPORTS最容易踩坑的点,没有之一:
SUPPORTS的方法,只有在「外层有事务」的情况下,才具备事务的回滚能力;如果外层无事务,这个方法就是「裸奔执行」,哪怕抛了RuntimeException、手动加了try-catch,数据库操作都不会回滚!
 

⚠️ 注意 2:SUPPORTS 永远不会主动「新建事务」

 
这个传播机制的名字是SUPPORTS(支持),意思是:它只支持「使用别人的事务」,自己从不创建事务。
 
无论任何情况,被SUPPORTS标记的方法,都不会主动新建事务,这是和REQUIRED的本质区别。

⚠️ 注意 3:事务的所有属性,都「继承外层事务」

SUPPORTS的方法加入外层事务后,它会完全继承外层事务的所有属性:
  • 隔离级别、超时时间、只读属性、回滚规则等,都和外层事务一致;
  • 事务的提交 / 回滚,完全由外层事务决定,内层方法无权单独提交或回滚。

✅ 七、SUPPORTS 正确使用场景(什么时候用?核心价值)

学完规则,一定要知道「在哪用」,SUPPORTS不是随便用的,它有明确的适用场景,这也是 Spring 设计这个传播机制的核心目的,记住:SUPPORTS 天生为「查询方法」而生!

✅ 适用场景 1:纯查询的业务方法(99% 的使用场景)

 
开发中我们有大量的查询方法(比如:查询订单详情、查询商品列表、查询用户信息),这类方法的特点:
 
  1. 只有SELECT语句,没有增删改,不需要事务保护;
  2. 但这些查询方法,可能会被「有事务的业务方法」调用(比如:下单时先查询库存,再扣减库存);
 
此时给查询方法加@Transactional(propagation=SUPPORTS)是最佳实践:
 
  • 如果被「无事务的方法」调用 → 无事务执行,查询效率更高(事务会加锁,无事务查询更快);
  • 如果被「有事务的方法」调用 → 加入事务,保证查询到的数据是「事务内的一致性数据」(避免脏读);

✅ 适用场景 2:可独立执行、也可被事务包裹执行的通用方法

比如一个「修改用户积分」的方法,它既可以被「下单流程(有事务)」调用,也可以被「手动签到(无事务)」调用:
  • 被下单流程调用 → 加入事务,积分修改和订单、库存一起提交 / 回滚;
  • 被手动签到调用 → 无事务执行,积分修改后直接提交,不影响其他操作;
这种「复用性高」的方法,用SUPPORTS最合适。
 

✅ 八、完整总结(所有核心要点,浓缩记忆)

✔️ 核心口诀

 
SUPPORTS → 有则加入,无则无事务
 

✔️ 核心差异(和 REQUIRED)

  • 外层有事务 → 两者行为完全一致,都加入外层事务;
  • 外层无事务 → REQUIRED 新建事务,SUPPORTS 无事务执行(唯一区别)。

✔️ 核心特性

  1. 永远不会主动新建事务;
  2. 无事务时抛异常不回滚,有事务时抛异常全局回滚;
  3. 继承外层事务的所有属性。

✔️ 最佳使用场景

所有只读的查询方法优先使用SUPPORTS,兼顾「执行效率」和「事务一致性」;其次是「可独立执行、也可被事务包裹」的通用业务方法。

✔️ 避坑核心

只要看到SUPPORTS,第一反应就是:这个方法有没有事务,完全看调用它的外层方法有没有加事务注解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1177981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek写的论文怎么降AI?这3款工具帮你搞定

DeepSeek写的论文怎么降AI?这3款工具帮你搞定 TL;DR:用DeepSeek写论文很方便,但AI率往往高达90%,直接提交必挂。单靠DeepSeek指令修改最多降到50%左右,要想降到安全线以下(20%),必须…

050.等差数列差分

等差数列首项 s 末项 e 共差 d等差数列差分 在区间[l,r]上加上一个等差数列 知道了区间长度,根据 e - s = d * (r - l) 对于s,e,d我们可以知二求三 对于原始数组a[]={0,0,0,0,0,0,0} 在[1,4]加上一个等差数列s=5,d=2,…

毕业论文AI检测不过关?学长亲历的通关攻略

毕业论文AI检测不过关?学长亲历的通关攻略 TL;DR:作为刚毕业的学长,我的论文也被AI检测卡过。从一开始的手忙脚乱到最后顺利通过,总结出一套完整的通关攻略:提前自测留足时间、找准问题段落精准修改、善用专业工具提效…

2026年热门扩香机品牌盘点:这些品牌值得一试,香薰精油/天然植物精油香氛/扩香器/瑜伽香氛,扩香机ODM代工厂推荐榜单 - 品牌推荐师

随着消费升级与空间美学需求的攀升,扩香机已从单一功能设备进化为场景化嗅觉体验的核心载体。据行业数据显示,2025年全球扩香机市场规模突破85亿美元,年复合增长率达12%,其中智能物联、定制化香型与全场景适配成为…

探讨售后完善的GEO推广专业公司,西安信之上怎么收费? - 工业品牌热点

当下越来越多企业意识到,AI搜索已成为精准获客的核心渠道,但面对如何选有实力的GEO推广企业求推荐GEO推广公司售后完善的GEO推广专业公司等问题时,却常陷入选择困境。本文结合企业实际需求,围绕这三个高频关键词展…

导师推荐!专科生必用TOP9 AI论文网站测评

导师推荐!专科生必用TOP9 AI论文网站测评 2026年专科生必备的AI论文工具测评 随着人工智能技术在学术领域的广泛应用,越来越多的专科生开始借助AI工具提升论文写作效率与质量。然而,面对市场上琳琅满目的AI论文网站,如何选择真正适…

8.1 医疗影像AI:UNet与TransUNet模型实战

8.1 医疗影像AI:UNet与TransUNet模型实战 在医疗人工智能领域,医学影像分析是一个核心应用方向。从X光片、CT扫描到MRI图像,医疗影像数据蕴含着丰富的诊断信息。然而,如何有效地从这些复杂的图像中提取出有价值的医学信息,一直是研究的热点问题。本章将深入探讨医疗影像分…

Java中public class与class

你想弄清楚Java中public class和class(默认访问权限)的核心区别,这是Java类定义的基础知识点,我会用通俗易懂的语言+代码示例,帮你把两者的差异、使用规则和适用场景讲透。 一、核心区别总览 先通过表格直观对比核…

8.2 病灶检测与分割:精准识别医学影像异常区域

8.2 病灶检测与分割:精准识别医学影像异常区域 在上一章中,我们学习了UNet和TransUNet等医学图像分割的基础模型。本章将深入探讨病灶检测与分割这一关键任务,这是医学影像分析中的核心应用之一。病灶检测与分割的目标是从医学影像中准确识别出异常区域(如肿瘤、病变等),…

5.3 表格识别与版面分析:搞定复杂文档结构解析

5.3 表格识别与版面分析:搞定复杂文档结构解析 引言 在前两节中,我们学习了OCR技术的发展历程和主流的多模态OCR架构。在实际应用中,许多文档具有复杂的结构,特别是表格和版面布局,这对OCR系统提出了更高的要求。表格识别和版面分析是文档理解中的关键任务,它们能够帮助…

ACPI!ACPIBuildCompleteCommon函数的作用是设置buildRequest->WorkDone为buildRequest->NextWorkDone以节点CP01为例子说明

ACPI!ACPIBuildCompleteCommon函数的作用是设置buildRequest->WorkDone为buildRequest->NextWorkDone1: kd> gu Breakpoint 5 hit eaxf7420746 ebx00000000 ecx89d37c08 edx00000000 esi89d37c0c edif743b318 eipf74133c3 espf791ad6c ebpf791adac iopl0 nv u…

Lesson12

Lesson 85-86 1、单词 漂亮beautiful nicesmartlovelygood-looking:男女均可以gorgeous just表示"刚刚"时只能用于现在完成时    Have you just been...just now在一般过去时中表达"刚刚"  …

【2026亲测】一键彻底禁止Windows 10/11自动更新,让电脑暂停更新100年!

你是否厌倦了Windows系统在工作或游戏时突然弹出的“正在更新”提示?虽然微软推送更新是为了安全,但在实际体验中,频繁的强制重启、更新后的驱动不兼容、甚至突如其来的“蓝屏死机”,让无数用户头疼不已。 更让人无奈的是&#xf…

5.4 OCR+翻译一体化:中英文混排文档的智能处理

5.4 OCR+翻译一体化:中英文混排文档的智能处理 引言 在前三节中,我们学习了OCR技术的发展历程、多模态OCR架构以及表格识别和版面分析技术。在实际应用中,许多文档包含多种语言的混合排版,特别是在国际化的商业和学术环境中,中英文混排文档非常常见。如何高效地处理这类…

6.2 视觉定位Grounding:让AI指出图像中的具体物体

6.2 视觉定位Grounding:让AI指出图像中的具体物体 引言 在上一节中,我们学习了视觉问答(VQA)技术,它让AI能够理解图像内容并回答相关问题。然而,在许多实际应用中,我们不仅需要AI理解图像中的内容,还需要它能够精确定位图像中的具体物体或区域。这就是视觉定位(Visu…

36排刀机怎么选?2025年附近重切削机型排行解析,动力刀塔/36排刀机/4+4车铣/尾顶机/双主轴/Y轴/正交Y排刀机定制有哪些 - 品牌推荐师

在精密制造领域,排刀机以其结构紧凑、换刀速度快、刚性强等优势,成为中小型、多工序复杂零件批量生产的利器。随着新能源汽车、高端装备、精密医疗器械等行业的迅猛发展,对零件加工效率与精度的要求日益严苛,尤其是…

6.3 DETR与GLIP:新一代目标检测技术详解

6.3 DETR与GLIP:新一代目标检测技术详解 引言 在前两节中,我们学习了视觉问答(VQA)和视觉定位(Grounding)技术,这些技术都依赖于准确的目标检测作为基础。传统的目标检测方法如Faster R-CNN、YOLO等虽然性能优秀,但存在一些固有的局限性,如需要复杂的后处理步骤(如…

2026年江苏省考面试培训企业推荐,中政公考靠谱之选 - 工业品牌热点

在江苏省考面试的备考赛道上,选择一家靠谱的培训机构,就像为冲刺阶段配备了精准的导航与强劲的引擎,直接关系到能否在千军万马中突出重围。面对市场上鱼龙混杂的机构,如何找到真正能提升面试能力、助力上岸的良师益…

2025年AI超级员工企业用户口碑排行,AI员工/AI超级员工/AI企业员工/AI智能员工供应商口碑推荐榜 - 品牌推荐师

行业洞察:AI超级员工市场迎来爆发式增长 随着人工智能技术的快速发展,AI超级员工正成为企业数字化转型的重要推动力。据行业数据显示,2024年全球AI超级员工市场规模已突破千亿元,预计到2025年将保持30%以上的年均增…

如何在Java中实现线程间的通信?

一、线程间通信的核心场景最典型的场景是生产者 - 消费者模型:生产者线程:生产数据(往共享容器里放数据)消费者线程:消费数据(从共享容器里取数据)通信需求:容器满时生产者等待&…