乐趣区

关于spring:​Spring事务的传播行为案例分析

简介: 网上对于 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 等,这里就不开展阐明,可自行百度。

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

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


无事务运行

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

![
qq’q](http://college.creditease.cn/resources/upload/image/20200804/1596529605681003338.jpeg))
事务的流传特行为为 required
后果是因为主键抵触将事务进行了回滚,所以两条数据都没有插入进去。

3、propagation_supports, 如果以后程序存在事务就退出该事务运行,如果不存在事务则在非事务中运行

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

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


事务的流传行为为 manatory
因为调用的外层没有事务,所以两条数据没有插入。大家想想上面这种写法会产生什么景象

事务的流传行为 mandatory

5、propagation_ required _new, 不论事务是不是存在,都会另起一个事务,如果事务存在则将以后事务挂起,从新执行新加的事务


事务的流传行为 required_new
后果和 require 一样,两条数据都没有入库,惟一健抵触导致第一条数据回滚,大家能够思考下我上面这两种状况。

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

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

6、propagation_ not _support, 示意不在事务中运行,如果以后存在事务则将事务挂起

![qqq
](http://college.creditease.cn/resources/upload/image/20200804/1596529886418082560.jpeg))
事务的流传行为 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

事务的流传行为级别简略的演示结束

作者:宜信技术学院,王巧敏

退出移动版