在java中什么是Spring 事务的传播行为带案例

lanhy
发布于 2020-9-1 11:30
浏览
0收藏

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

本文转载自宜信技术学院。

 

于网上上Spring事务的传播和隔离以及不负责任地直接复制名词含义的文章很多。 尽管文章很多看的云里雾里,但今天我们将提供案例并与大家一起学习。

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

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

一、事务的特性 ACID
这四个英文单词拼写我一直记不住,求记忆方法

原子性 (Atomicity):事务是一系列原子操作,要么全部成功,要么全部失败。
一致性 (Consistency): 一旦完成 (不管是成功还是失败),确保它所在的一系列业务状态保持一致,状态都是成功,或者都是失败,不能一部分成功一部分失败。
隔离性 (Isolation): 不同事务同时进行某项业务,处理相同的数据时候,需要保证事务之间相互独立,互相之间数据不影响。
持久性 (Durability):一旦事务完成,无论发生什么系统性错误,事务执行后的数据都被持久化了,不会因为重启或其他操作对数据进行更改。
二、spring 事务传播特性的定义以及案例分析
我们先给出定义再分别进行简单的代码分析

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

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

在java中什么是Spring 事务的传播行为带案例-鸿蒙开发者社区

三、案例解析事务传播 7 大行为
1、无事务,这个时候 id 为 16 的第一次插入成功,第二次插入的时候失败,库中留存第一次的数据在java中什么是Spring 事务的传播行为带案例-鸿蒙开发者社区

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

在java中什么是Spring 事务的传播行为带案例-鸿蒙开发者社区

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

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

 

在java中什么是Spring 事务的传播行为带案例-鸿蒙开发者社区

事务的传播行为 required_new(代码注释清忽略)
结果和 require 一样,两条数据都没有入库,唯一健冲突导致第一条数据回滚,大家可以思考下我下面这两种情况。在java中什么是Spring 事务的传播行为带案例-鸿蒙开发者社区

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

在java中什么是Spring 事务的传播行为带案例-鸿蒙开发者社区

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

在java中什么是Spring 事务的传播行为带案例-鸿蒙开发者社区

事务的传播行为 required_new(代码注释清忽略)
结果和 require 一样,两条数据都没有入库,唯一健冲突导致第一条数据回滚,大家可以思考下我下面这两种情况。

在java中什么是Spring 事务的传播行为带案例-鸿蒙开发者社区

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

 

在java中什么是Spring 事务的传播行为带案例-鸿蒙开发者社区

情景 2 外围事务失败会不会导致新起事务已提交的回滚?
6、 propagation_not_support, 表示不在事务中运行,如果当前存在事务则将事务挂起

在java中什么是Spring 事务的传播行为带案例-鸿蒙开发者社区

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

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

在java中什么是Spring 事务的传播行为带案例-鸿蒙开发者社区

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

在java中什么是Spring 事务的传播行为带案例-鸿蒙开发者社区

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

本文转载自宜信技术学院。

分类
标签
已于2020-9-2 18:14:11修改
收藏
回复
举报
回复
    相关推荐