《HarmonyOS:领航者说》技术公开课来啦,大咖分享、实战解码,不容错过 了解详情
写点什么

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

评论

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

微服务转型系列4:理念指导实践,厘清微服务建设的主要内容和顺序

BoCloud博云

微服务

Arthas-技术专题-使用指南

码界西柚

Arthas 5月日更

最近又有出什么新电影,要不要停泊片刻,与好友相约一起来去看呢?

叶小鍵

声网、新东方、伴鱼英语的音视频技术解读

Jessie

音视频 视频消音

GitHub开源:狗屁不通文章生成器

不脱发的程序猿

GitHub 开源 狗屁不通文章生成器

怎样做好服务提供方

程序员架构进阶

架构设计原则 服务化 28天写作 5月日更

如何让消息队列达到最大吞吐量?

万俊峰Kevin

微服务 消息队列 Queue Go 语言

百信银行基于 Apache Hudi 实时数据湖演进方案

Apache Flink

大数据 flink

聊聊人像抠图背后的算法技术

华为云开发者联盟

hilens 抠图 工程 抠图算法 baseline

作为最好用的可观测平台,如何监控 Grafana

耳东@Erdong

Grafana Prometheus 5月日更

【LeetCode】停在原地的方案数Java题解

Albert

算法 LeetCode 5月日更

Nginx性能分析之gpreftools

运维研习社

nginx 性能分析 5月日更

Dubbo 本地调用

青年IT男

dubbo

给Java小白,整理一套能上手的简单编程算法题!!!

小傅哥

Java 程序员 数据结构 算法 小傅哥

华为云官网负责人明哥:我们是如何做到门面不倒,8个月挑战业界翘楚?

华为云开发者联盟

JavaScript node.js Serverless 云原生 大前端

test1

靠谱哥

PyQt5 实现可空值的 QDateTimeEdit

一代咩神

Python PyQt QDateTimeEdit

VMWare中Ubuntu网络配置

进击的梦清

Linux 运维 vmware 网络配置

ThreadLocal不好用?那是你没用对!

王磊

Java 后端 多线程 ThreadLocal 5月日更

SpringBoot技术专题—来看看异步处理返回方案

码界西柚

Java WebAsyncTask 5月日更 AsyncContext DeferredResult

python str模块

若尘

Python编程 str 5月日更

单片机I/O控制方式(UART中断和DMA中断的区别)

不脱发的程序猿

嵌入式 单片机 GPIO的原理、特性 单片机I/O设备的控制方式

深度剖析 | 关于数据锁定和读取一致性问题

VoltDB

数据库 数据分析 5G

华为中国生态大会2021举行在即,GaussDB将重磅发布5大解决方案

华为云开发者联盟

数据库 opengauss 华为云 GaussDB 云数据库

音视频在智能手表上的应用

anyRTC开发者

音视频 WebRTC IoT RTC

参照STM32时钟树配置STM32CubeMX Clock Configuration(STM32L011G4U6为例)

不脱发的程序猿

单片机 STM32微控制器 时钟树 STM32CubeMX STM32时钟配置

Fluid 进入 CNCF Sandbox,加速大数据和 AI 应用拥抱云原生

阿里巴巴云原生

人工智能 容器 云原生 调度 弹性计算

真实的DevOps落地,应该是这样的 ↓

BoCloud博云

DevOps 敏捷开发

追寻软件定义的梦想汽车

车骑

自动驾驶 智能汽车 软件定义汽车 汽车制造

不忘过去,不畏将来

小天同学

5月日更 汶川地震 不忘过去

一文带你读懂PyQt:用Python做出与C++一样的GUI界面应用程序

老猿Python

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