写点什么

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:062411

评论

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

先收藏!关于Java类、接口、枚举的知识点大汇总

华为云开发者联盟

Java 接口 枚举

浅谈nodejs进程和线程

梁龙先森

大前端 nodejs 2月春节不断更

容器 & 服务:一个Java应用的Docker构建实战

程序员架构进阶

Docker 容器 七日更 28天写作 2月春节不断更

还愁追不到女神吗?一键生成舔狗日记,一秒速成舔狗之王

不脱发的程序猿

程序人生 28天写作 二月春节不断更 舔狗文化

一文带你熟悉Pytorch->Caffe->om模型转换流程

华为云开发者联盟

网络 模型 PyTorch caffe 算子边界

MySQL查看及杀掉链接方法大全

Simon

MySQL

架构师不至于“架构”-《架构师应该知道的37件事》阅读笔记

Harris

读书笔记 架构 架构师

测试InfoQ 平台发布文章

木子的昼夜

我身边的高T,问了Java面试者这样的问题......

京东科技开发者

MySQL 数据库

配合Github Actions 做一个自动推送的 Rss 订阅机器人

Leetao

Python RSS Github Action

超强前端面试真题+资源推荐

爱学习

面试 大前端 面经

话题讨论 | 你在互联网大厂是个啥级别?

架构精进之路

话题讨论 28天写作 话题王者

详解SSH 框架中对象调用流程

华为云开发者联盟

spring hibernate struts SSH 框架

私有云、公共云、混合云安全性的优点和缺点

云计算

【LeetCode】托普利茨矩阵Java题解

Albert

算法 LeetCode 28天写作 2月春节不断更

Flink SQL 性能优化:multiple input 详解

Apache Flink

flink

为什么不推荐使用汉字作为密码?

不脱发的程序猿

程序人生 密码学 28天写作 二月春节不断更

技术扫盲:关于低代码编程的可持续性交付设计和分析

小傅哥

Java 小傅哥 服务端 低代码开发 可持续交付

我与技术面试那些事儿

我是哪吒

CSS html 大前端 28天写作 2月春节不断更

Apache Flink 在快手的过去、现在和未来

Apache Flink

flink

Dapr 知多少 | 分布式应用运行时

架构 云原生 k8s dapr

Kafka.04 - Kafka 部署

insight

kafka 2月春节不断更

日记 2021年2月22日(周一)

Changing Lin

2月春节不断更

用Stylish精简极客时间专栏页面

Tao

CSS

2021最新百度/平安/蚂蚁金服/腾讯/拼多多面经总结(附答案解析)

比伯

Java 编程 架构 面试 计算机

基于证券云服务的总体架构设计应该怎么做?

Jason Tien

诊所数字化:诊所开展私域运营的优劣势

boshi

医疗 私域运营 七日更 28天写作

WinDbg 分析高内存占用问题

dotnet windbg

JVM又曾放过谁,垃圾终将被回收!

Simon郎

Java 大数据 架构 后端 JVM

工作日志2-20

技术骨干

技术解析 | Doris SQL 原理解析

百度开发者中心

百度 Doris SQL优化

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