阿里云飞天发布时刻,领先大模型限免,超7000万 tokens免费体验 了解详情
写点什么

Spring 事务的传播行为案例分析

  • 2020-08-21
  • 本文字数:1622 字

    阅读完需:约 5 分钟

Spring事务的传播行为案例分析

网上关于 Spring 事务传播性以及隔离型的文章漫天盖地,还有不负责任的直接复制名词意思,文章虽然很多却是看的云里雾里,我们今天将给出案例分别和大家一起学习。


1、spring 给出经常面试的考点 Spring 事务的 4 个特性含义—这个很容易理解


2、spring 事务传播特性的定义以及案例分析

一、事务的特性 ACID

这四个英文单词拼写我一直记不住,求记忆方法


  • 原子性(Atomicity):事务是一系列原子操作,要么全部成功,要么全部失败。

  • 一致性(Consistency):一旦完成(不管是成功还是失败),确保它所在的一系列业务状态保持一致,状态都是成功,或者都是失败,不能一部分成功一部分失败。

  • 隔离性(Isolation):不同事务同时进行某项业务,处理相同的数据时候,需要保证事务之间相互独立,互相之间数据不影响。

  • 持久性(Durability):一旦事务完成,无论发生什么系统性错误,事务执行后的数据都被持久化了,不会因为重启或其他操作对数据进行更改。

二、spring 事务传播特性的定义以及案例分析

我们先给出定义再分别进行简单的代码分析


给出百度图片,请大家参考,首先生命力如果想在工程中运用事务 spring 的 xml 必须开启事务,以下这些特性一般都是在 xml 属性中进行配置。


类似这种的配置一定要有,否则万事具备只欠东风,这个是 DB 事务有 JTA 和 JPA 以及 Herbernate 等,这里就不展开说明,可自行百度。


三、案例解析事务传播 7 大行为

1、无事务,这个时候 id 为 16 的第一次插入成功,第二次插入的时候失败,库中留存第一次的数据



无事务运行


2、Propagation_required,默认事务的传播行为 required,在进行实验 2 的时候将表中 id 为 16 的数据先删除以免影响接下来的测试。@Transactional(propagation=Propagation.REQUIRED) == @Transactional 这两个的作用是一样的没有事务创建一个事务执行,



事务的传播特行为为 required


结果是因为主键冲突将事务进行了回滚,所以两条数据都没有插入进去。


3、propagation_supports,如果当前程序存在事务就加入该事务运行,如果不存在事务则在非事务中运行



事务的传播行为性为 supports


因为调用方未用事务那么就在非事务中运行,所以插入了 first 的第一条数据。


4、propagation_mandatory,必须在一个事务中运行,否则就会抛出异常 mandatory 这个单词有强制性的意思我们默认用 required 而不用 mandatory,是因为 mandatory 不能自动创建事务。



事务的传播行为为 manatory


因为调用的外层没有事务,所以两条数据没有插入。大家想想下面这种写法会发生什么现象事务的传播行为 mandatory



事务的传播行为 mandatory


5、propagation_new_required,不管事务是不是存在,都会另起一个事务,如果事务存在则将当前事务挂起,重新执行新加的事务



事务的传播行为 required_new(代码注释清忽略)


结果和 require 一样,两条数据都没有入库,唯一健冲突导致第一条数据回滚,大家可以思考下我下面这两种情况。



情景 1 新起的事务抛出异常会不会让外围事务回滚?



情景 2 外围事务失败会不会导致新起事务已提交的回滚?


6、 propagation_not_support,表示不在事务中运行,如果当前存在事务则将事务挂起



事务的传播行为 not_suppoted


这种情景下,如果你根据我的思路一步走的应该可以想到 id 为 17 的入库,第二条主键冲突虽然然而 notSupportSonTransationsl()这个方法没有事务所以不影响第一条入库情况,但是外围事务 id 为 16 的要进行回滚了,所以库中只有一条数据 id=17 的。


7、 propagation_never,表示当前方法不能运行在事务当中,如果有事务则会抛出异常---->Existing transaction found for transaction marked with propagation 'never’



事务的传播行为 NEVER


8、 propagation_nested,这种嵌套的事务,外围如果没有事务则自己另起一个事务,可独立与外围事务进行单独的提交或者回滚(这句话不要理解错了),下面这个案例同样的数据一条也没有落入库中.



事务的传播行为 nested


事务的传播行为级别简单的演示完毕


本文转载自宜信技术学院。


原文链接


Spring事务的传播行为案例分析


2020-08-21 14:062443

评论

发布
暂无评论
发现更多内容

Kafka的生产集群部署

编程江湖

kafka

AWS Command Line Interface 使用S3入门

阿呆

AWS S3

【前端】一文彻底学会Promise

恒生LIGHT云社区

JavaScript 前端 Promise

高新技术企业几维科技加入龙蜥,为操作系统安全添砖加瓦

OpenAnolis小助手

Linux 开源

一文了解登陆Hoo虎符的Moonbeam治理通证GLMR

区块链前沿News

Hoo 虎符交易所 Moonbeam GLMR

低代码实现探索(十三)字典.静态实体.系统变量

零道云-混合式低代码平台

大咖眼中的AI开源|王敏捷:深图在人工智能中的探索和研究

亚马逊云科技 (Amazon Web Services)

网络

服务探活的五种方式

捉虫大师

微服务 dubbo 健康检查 服务探活

TCP socket和web socket的区别

汪子熙

前端 node,js 1月月更

模块六作业

Geek_e6f7f6

架构训练营

如何提高后台服务应用问题的排查效率?日志 VS 远程调试

汪子熙

node.js 后台开发 1月月更

万字总结Keras深度学习中文文本分类

华为云开发者联盟

深度学习 CNN keras 文本分类 TextCNN

大数据开发之离线分析工具Hive

@零度

大数据 hive

Tech Talk 活动预告|“公有云+5G” 时代下的开发难题,架构师大咖带你逐个击破!

亚马逊云科技 (Amazon Web Services)

网络

开发者喜欢的“夜宵”是什么?揭秘开发者的独特“口味”

OceanBase 数据库

数据库 开源 新年 oceanbase 开发者大会

盘点 | 常用 PG 数据恢复方案概览【建议收藏】

RadonDB

数据库 postgresql RadonDB

强化云原生基础服务,焱融科技 YRCloudFile 与秒云完成产品兼容性互认证

焱融科技

云计算 分布式 云原生 高性能 文件存储

🏆【Alibaba中间件技术系列】「RocketMQ技术专题」让我们一同来看看RocketMQ和Kafka索引设计

码界西柚

RocketMQ Alibaba Alibaba技术 1月月更

全面拆解携程云原生实践,打造智能弹性的云端酒店直连系统!

亚马逊云科技 (Amazon Web Services)

网络

读《底层逻辑》

wood

300天创作

java开发之SpringBoot转发和重定向

@零度

JAVA开发 springboot

APP性能分析工作台——你的最佳桌面端性能分析助手

字节跳动终端技术

字节跳动 APM Mars 应用性能监控产品

研读网络安全法律法规,提升技术管理者 “法” 商

星环科技

百度搜索中台新一代内容架构:FaaS化和智能化实战

百度Geek说

架构 后端 搜索 Faas

2021中国开源先锋33人榜单出炉:华为三位开源专家入选

科技热闻

如何突破职业瓶颈

FunTester

Go 性能测试 测试框架 FunTester 职业瓶颈

尚硅谷《MySQL高级特性篇》教程发布

@零度

MySQL

使用亚马逊云科技安全服务防御、检测和响应 Log4j 漏洞

亚马逊云科技 (Amazon Web Services)

网络

The Data Way Vol.9|还不清楚商业化之于开源的价值?建议你看看这家公司

SphereEx

数据库 开源 播客 ShardingSphere SphereEx

2022年,跨境ERP还是一门好生意吗?

ToB行业头条

近数据处理(NDP)——GaussDB(for MySQL)性能提升的秘密

华为云开发者联盟

MySQL 多线程 GaussDB(for MySQL) 近数据处理 算子下推

Spring事务的传播行为案例分析_编程语言_王巧敏_InfoQ精选文章