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

Easter79
• 阅读 236

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

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

1、给出Spring事务的4个特性含义

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

一、事务的特性ACID

1.1 理解事务特性(这四个英文单词拼写我一直记不住,求记忆方法)

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

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

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

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

二、spring事务传播特性的定义

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

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

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

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

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

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

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

无事务运行

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

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

事务的传播特行为为required

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

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

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

事务的传播行为supports

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

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

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

事务的传播行为为manatory

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

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

事务的传播行为mandatory

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

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

事务的传播行为required_new

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

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

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

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

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

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

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

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

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

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

事务的传播行为NEVER

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

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

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


⭐️⭐️⭐️欢迎加入“宜信技术交流群”。进群方式:请加小助手微信(微信号:creditease_tech)。

◆ ◆ ◆ ◆ ◆

如需转载请与小助手(微信号:creditease_tech)联系。****发现文章有错误、对内容有疑问,都可以通过关注宜信技术学院微信公众号(CE_TECH),在后台留言给我们。我们每周会挑选出一位热心小伙伴,送上一份精美的小礼品。快来扫码关注我们吧!

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

⏬点击“阅读原文”查看更多技术干货

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

本文分享自微信公众号 - 宜信技术学院(CE_TECH)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
OMG!Java高级开发岗必问知识点
目录1.Mysql2.CHAR与VARCHAR的区别?3.能说下myisam和innodb的区别吗?4.你能说下事务的基本特性和隔离级别吗?5.并发问题脏读、不可重复读、幻读?6.事务的隔离级别?7.说说自增主键、UUID?8.mysql的约束分类?9.drop、delete与tru
Easter79 Easter79
2年前
spring事物管理之传播行为和隔离级别
大家在使用spring的注解式事务管理时,对事务的传播行为和隔离级别可能有点不知所措,下边就详细的介绍下以备方便查阅。事物注解方式:@Transactional当标于类前时,表示类中所有方法都进行事物处理例子:@TransactionalpublicclassTestServiceBeanimplementsTest
Easter79 Easter79
2年前
spring事务传播性(PROPAGATION)
spring事务传播性PROPAGATION\_REQUIRED简介加入当前已有事务;只有当前没有事务才启一个新的事务设计类ServiceA,方法methodA,事务级别定义为PROPAGATION_REQUIRED类ServiceB,方法method
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
MySQL数据库InnoDB存储引擎Log漫游(1)
作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k