前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring事物的传播行为案例分析

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

作者头像
宜信技术学院
发布2020-08-05 15:08:42
5430
发布2020-08-05 15:08:42
举报
文章被收录于专栏:宜信技术实践宜信技术实践

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

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

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

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

一、事务的特性ACID

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

  • 原子性(Atomicity):事务是一系列原子操作,要么全部成功,要么全部失败。
  • 一致性(Consistency):一旦完成(不管是成功还是失败),确保它所在的一系列业务状态保持一致,状态都是成功,或者都是失败,不能一部分成功一部分失败。
  • 隔离性(Isolation):不同事务同时进行某项业务,处理相同的数据时候,需要保证事务之间相互独立,互相之间数据不影响。
  • 持久性(Durability):一旦事务完成,无论发生什么系统性错误,事务执行后的数据都被持久化了,不会因为重启或其他操作对数据进行更改。

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

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

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

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

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

1.png
1.png

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

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

无事务运行

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

事务的传播特行为为required 

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

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

事务的传播行为性为supports

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

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

事务的传播行为为manatory 

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

6.jpeg
6.jpeg

事务的传播行为mandatory

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

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

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

8.jpeg
8.jpeg

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

9.jpeg
9.jpeg

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

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

事务的传播行为not_suppoted 

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

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

事务的传播行为NEVER

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

事务的传播行为nested

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring事物的传播行为案例分析
    • 一、事务的特性ACID
      • 二、spring事务传播特性的定义以及案例分析 
        • 三、案例解析事务传播7大行为
        相关产品与服务
        腾讯云代码分析
        腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档