spring事务传播特性_Spring事务的传播行为案例分析

本文深入探讨了Spring事务的7种传播特性,包括REQUIRED、SUPPORTS、MANDATORY、REQUIRED_NEW、NOT_SUPPORTED、NEVER和NESTED,并通过案例分析了它们在实际操作中的影响,帮助读者理解和掌握事务的ACID特性。
摘要由CSDN通过智能技术生成

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

1、给出Spring事务的4个特性含义2、spring事务传播特性的定义以及案例分析

一、事务的特性ACID

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

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

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

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

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

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

9f2d2352b114aec1ca469e07b0d7e53c.png

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

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

02200b4f2c8f84bc00ae4ccaefc128b2.png

无事务运行

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

74726f41f0aacd5ee9e3148c805182a0.png

事务的传播特性为为required

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

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

02d182eef938d2c7f5cb94ccd4cb12f8.png

事务的传播行为supports

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

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

495bd7738258f41a7e69f1ebbf5c62a5.png

事务的传播行为为manatory

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

099dc8563de5f27972472f5ab028941d.png

事务的传播行为mandatory

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

efcdf7c7ace2c6c9ede42e116cd8dd47.png

事务的传播行为required_new

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

de2764cad41f96268715169e253c3414.png

新起事物失败导致外围事物失败-外围事物

02c8d440369f3417e3505f5340fbf4cc.png

新起事物失败导致外围事物失败-新起事物主键冲突回滚

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

bdb1cf94c6373ea037966cc47112db6a.png

事务的传播行为not_suppoted-外围事物

97a78999c83d2ed02ba2d600972fc5c6.png

事务的传播行为not_suppoted

这种情景下,如果你根据我的思路一步走的应该可以想到id 为17的入库,但是外围事务id为16的要进行回滚了,所以库中只有一条数据id=17的。

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

3ac887596b58b2660773b50d94d3858f.png

事务的传播行为NEVER

8、 propagation_nested,这种嵌套的事务,外围如果没有事务则自己另起一个事务,可独立与外围事务进行单独的提交或者回滚(这句话不要理解错了)。

76e8ce6b37fe1940d28c27d902daeb13.png

事物的传播特性propagation_nested

eb0d0c852a253460703f37009d2dede5.png

事物的传播特性propagation_nested

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值