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

网上关于Spring事务传播性以及隔离型的文章漫天盖地,还有不负责任的直接复制名词意思,文章虽然不少倒是看的云里雾里,咱们今天将给出案例分别和你们一块儿学习。面试

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

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

1、事务的特性ACID

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

  • 原子性(Atomicity):事务是一系列原子操做,要么所有成功,要么所有失败。测试

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

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

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

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

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

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

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

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

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

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

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

 qqq
无事务运行

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

<br/>qq'q
事务的传播特行为为required
结果是由于主键冲突将事务进行了回滚,因此两条数据都没有插入进去。

三、propagation_supports,若是当前程序存在事务就加入该事务运行,若是不存在事务则在非事务中运行

qqq

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

四、propagation_mandatory,必须在一个事务中运行,不然就会抛出异常mandatory 这个单词有强制性的意思咱们默认用required 而不用mandatory,是由于mandatory不能自动建立事务。

qqq
事务的传播行为为manatory
由于调用的外层没有事务,因此两条数据没有插入。你们想一想下面这种写法会发生什么现象
qqq
事务的传播行为mandatory

五、propagation_ required _new,无论事务是否是存在,都会另起一个事务,若是事务存在则将当前事务挂起,从新执行新加的事务

qqq
事务的传播行为required_new
结果和require同样,两条数据都没有入库,惟一健冲突致使第一条数据回滚,你们能够思考下我下面这两种状况。

qqq

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

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

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

六、 propagation_ not _support,表示不在事务中运行,若是当前存在事务则将事务挂起

qqq<br/>
事务的传播行为not_suppoted
这种情景下,若是你根据个人思路一步走的应该能够想到id 为17的入库,第二条主键冲突虽然然而notSupportSonTransationsl()这个方法没有事务因此不影响第一条入库状况,可是外围事务id为16的要进行回滚了,因此库中只有一条数据id=17的。

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

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

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

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

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

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