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

Spring的事务传播行为

简单来说,它决定了多个事务方法互相调用时,事务应该如何传递。比如,方法 A 调用了方法 B,这时 Spring 需要明确:B 是否要加入 A 的事务?还是自己独立开一个新事务?或者完全不开启事务?这就是传播行为要解决的问题。


通俗场景举例

假设你去银行转账:

  1. 主业务:从账户 A 转 100 元到账户 B(方法 A)。
  2. 子操作:记录转账日志(方法 B)。

如果转账失败,你希望日志记录也回滚吗?

  • 如果希望回滚:日志记录(方法 B)加入主事务(方法 A)一起回滚。
  • 如果不希望回滚:日志记录(方法 B)独立开启新事务,即使转账失败,日志依然保存。

传播行为就是用来控制这种“事务边界”的规则!


常见的传播行为(重点掌握前3种)

  1. REQUIRED(默认)
    • 规则:如果当前有事务,就加入;没有事务,就新建一个。
    • 举例:转账(A)和日志(B)用同一个事务,A 失败,B 也回滚。
  2. REQUIRES_NEW
    • 规则:无论如何都新建事务,原事务挂起,新事务独立提交或回滚。
    • 举例:日志记录(B)用新事务,即使转账(A)失败,日志依然保存。
  3. SUPPORTS
    • 规则:有事务就加入,没有就不开启事务。
    • 举例:查询操作(B),如果调用方(A)有事务则加入,否则非事务执行。
  4. 其他(了解即可)
    • NOT_SUPPORTED:强制非事务执行,原事务挂起。
    • MANDATORY:强制调用方必须有事务,否则抛异常。
    • NEVER:强制调用方必须无事务,否则抛异常。
    • NESTED:嵌套事务(依赖于数据库支持),子事务可独立回滚。

为什么需要传播行为?

  • 保证数据一致性:避免多个操作互相干扰(比如错误覆盖或错误提交)。
  • 灵活控制事务边界:根据业务需求,决定哪些操作要一起成功/失败,哪些要独立。

一句话总结
传播行为就像交通规则,告诉事务方法在互相调用时,是“挤一辆车”(共用事务)还是“自己开车”(独立事务),确保数据操作安全有序。

http://www.xdnf.cn/news/8261.html

相关文章:

  • PCB设计教程【入门篇】——电路分析基础-电路定理
  • tf 重排 切分 逆排列
  • mysql日志文件binlog分析记录
  • 结构性断裂:中年失业潮与婚姻解体的崩溃逻辑
  • 数学基础知识:三角函数
  • 【打卡】车厢重排
  • java后端-海外登录(谷歌/FaceBook/苹果)
  • 汽配知识(四)不同车型与区域市场的分类差异
  • 率先实现混合搜索:使用 Elasticsearch 和 Semantic Kernel
  • Java IO流完全解析:从基础到高级应用
  • Vue.js教学第十一章:VueRouter实战指南
  • 在 Matter.js 物理引擎中,isSensor 布尔属性的使用
  • MySQL 数据库表结构修改与字段添加
  • C++:关联容器set容器,multiset容器
  • 【Python】开发工具uv
  • KS107BG型超声体模的结构及性能
  • Pinia持久化存储插件, 持久化存储插件安装(超详细教程)
  • 【KWDB 2025 创作者计划】_KWDB时序数据库特性及跨模查询
  • 使用 vip 加入两台 master 节点
  • 【AI模型学习】上/下采样
  • 【SpringBoot实战指南】使用 Spring Cache
  • 5.22 打卡
  • 生存资料的多因素分析,如果满 足等比例风险假定, 采用Cox回归; 如果不满足等比例风险假定,则考虑采用 非等比例Cox回归分析研究预后因素的影响
  • Java版本的VPN(wlcn)
  • 我的世界模组开发——物理学(1)
  • PiliPlus 非常好用的开源软件第三方B站哔哩哔哩 v1.1.3.35
  • Vue 3.0中异步组件defineAsyncComponent
  • JC/T 2387-2024 改性聚苯乙烯泡沫(EPS)复合装饰制品检测
  • 从零基础到最佳实践:Vue.js 系列(10/10):《实战项目——从零到上线》
  • 2025淘宝最新DSR评分计算方式