Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. Java
  3. 正文
                           

【转载】Spring事务的七种传播特性

2023-12-16 2005点热度 0人点赞 0条评论

上一篇文章中见过了事务的特性以及隔离级别,今天来说一下事务的传播性,事务是一个好东西,但是并不是每一个方法都应该加上事务,在事务的隔离级别中提到过一点:越是严格,耗费的性能越大,那么如果每个方法都加了事务,而不论是否会涉及到数据的修改,那么这就属于事务的滥用了,没起到应有的作用不说,反而还会一点点的拖慢你的系统。

为了应对这一问题,“事务的传播性”这一概念又横空出世了,打个最简单的比方:现在的项目中,大多都分层,controller层 + service层 + dao层,而业务一般都堆积在service层,要么是service调service,要么是service调dao,那么我们的事务一般也都是加在service层的,此时我们并没有给dao层也加上事务,但是却能达到失败回滚的效果,这就是事务的传播性生效了,更通俗点儿的理解就是service层把事务传递给了dao层。

Srping事务的七种传播特性

上面举的例子,并不是很难理解,我们现在来看一下Spring事务都有哪些传播性(以方法A调用方法B为例来详解):

PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务;

方法A调用方法B,如果方法A的已经有开启事务了,那么方法B就不会再新开启事务,而是直接使用方法A的事务,不管双方哪一个执行失败,都会一起回滚。

PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起;

方法A调用方法B,就算方法A已经开启了事务,那么方法B也依旧会开启一个新的事务,执行期间将方法A的事务挂起,直到执行完毕之后才开始继续执行方法A,如果方法A执行失败回滚,不会影响到方法B,方法B该提交还是一样提交。

PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行;

此方式比较特殊,是一种随波逐流的方式,如果有它就用,如果没有它就不用。

PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起;

不支持事务,如果方法A已经开启了事务,调用方法B时,会将方法A的事务挂起之后开始执行方法B,执行完毕之后继续执行方法A。

PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常;

强制在一个事务中执行,如果方法A开启了事务,方法B也试图开启一个事务,此时就会直接抛出异常。

PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常;

不支持事务,如果强制开启事务,或者方法A已经开启了事务,再来调用方法B,就会直接抛出异常。

PROPAGATION_NESTED:新建事务,依赖于上级事务,如果失败则一同回滚;

这个事务和requires_new很相似,但是不同点在于事务提交的时候,它会让方法B依赖于方法A的事务,B就算开启了事务,也不会主动提交,而是等待A一起提交,此时如果A报错回滚了,那么B也会一起回滚。

注意:spring事务中,默认是只有运行时异常(RuntimeException及其子类)才会回滚,而且使用的默认传播性是REQUIRED。

转自:不忘初心 https://www.jiweichengzhu.com/article/8488e494ff8e45b58fe3de6821c1b97a

更多文章:

  1. Spring 七种事务传播性介绍
  2. Spring事务无法生效的11个场景
  3. 事务的特性和隔离级别
  4. 事务异常:Transaction rolled back because it has been marked as rollback-only
  5. 聊聊spring事务失效的12种场景,太坑了
  6. Java后端18种接口优化技巧
  7. 实现一个状态机引擎,教你看清DSL的本质
  8. FSM-COLA无状态状态机
  9. Spring中@Autowired和@Inject注解的区别?
  10. JVM GC问题定位排查方法综述
标签: 转载 数据库 Java 后端 Spring 事务 传播特性
最后更新:2023-12-16

coder

分享干货文章,学习先进经验。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

广告
最新 热点 推荐
最新 热点 推荐
微服务架构:必懂的6大性能维度 Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代 视频笔记-微服务架构P4:必懂5种设计模式 视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构 干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议
视频笔记-微服务架构P4:必懂5种设计模式Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代微服务架构:必懂的6大性能维度
理解DDD之限界上下文和核心域、支撑域、通用域 7张架构图掌握后端服务重构技巧 ChatGLM:ChatGPT的替代方案 系统设计 | 多对多关系模型拆解案例 7. MVC及其变种(译) 系统设计 | 数据字典方案 JVM 内存大对象监控和优化实践 Eureka源码剖析之四:服务续约

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (3) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (20) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2