Spring事务传播机制大白话(使用springboot,注解演示)
1. 我对传播机制的理解
- 为什么需要传播机制?
因为事务之间可能存在相互调用,例如service业务层的方法存在相互调用,如果相互调用的方法都开启了事务(对应到springboot就是在方法上要添加@Transactional注解),那么程序需要以什么样的策略来执行事务呢?因此需要我们指定好事务传播机制,程序遇到这种情况就可以根据我们事先指定好的传播机制来执行。
2. spring其中事务传播机制
默认的事务传播机制是required,点进注解看源码:
事务传播行为类型 | 说明 |
---|---|
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行 |
PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |
3. 实验验证
3.1. NEVER
3.1.1 调用方不开启事务(不添加Transactional注解)
代码如下,在controller调用service方法,实验前id=3的用户开始的money是1000,正常情况下想把其money更新为900
代码如下:
Controller中testTransaction去调用service中的testTransaction,可以看到右侧被调用的方法上边传播机制设置的NEVER,执行后效果如下:
发现当Controller层不加Transactional注解,Service层的testTransaction方法上添加Transactional并且把传播机制设置为NEVEL后,事务并没有生效,执行完后抛出了异常,但是数据库还是写进去了。
每次做完实验记得把数据库的900还原成1000;
3.1.2 调用方开启事务(添加Transactional注解)
请求执行后可以看到直接抛出了异常, Existing transaction found for transaction marked with propagation ‘never’,说明调用方式不能有事务的,如果有就直接抛出上图种的异常,并且Service层的业务代码并没有执行,没有抛出 除以0的异常。
3.1.3 总结
NEVEL传播机制,要求调用方不能有事务,在本测试中表现就是Ctroller中的testTransaction方法上不能有事务的注解
3.2. REQUIRED
3.2.1 service层的传播机制设置为required
service层的传播机制设置为required时,无论Controller层开启或者不开启事务,结果都是如下:
3.2.2 结论
说明当被调用方开启了事务,并且传播机制是required的时,一定会以事务的方式执行,具体表现就是如上边的图示,代码抛出了异常 / by zero,同时数据库中并没有写入900,说明异常后数据回滚了。
其他的就不再一一测试了,都是一个道理,始终记住列表中说的“当前事务”指的是调用方。
Spring事务传播机制大白话(使用springboot,注解演示)相关推荐
- spring上下文是什么意思_Java程序员只会CRUD连Spring事务传播机制都不懂?
AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东西,面试完就 ...
- 原创 | CRUD更要知道的Spring事务传播机制
来自:肥朝 AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东 ...
- Spring事务传播机制以及事务嵌套
Spring事务传播机制以及事务嵌套 Spring事务传播机制 事务嵌套场景 情景0: 场景1:不同类中,开启事务的方法调用没有开启事务的方法 场景2:不同类中,methodA方法嵌套methodB方 ...
- Spring事务传播机制和隔离级别
Spring有5种隔离级别,7种传播行为.这是面试常问的内容,也是代码中经常碰到的知识点.这些知识枯燥而且乏味,其中有些非常的绕.如果栽在这上面,就实在是太可惜了. @Transactional(is ...
- Spring 事务传播机制 实例讲解
事务传播机制 对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011 spring的管理的事务可以分为如下2 ...
- Spring: 事务传播机制
文章目录 1.美图 2.@Transactional 注解的属性信息 3.案例 3.1 建表 3.2 项目结构 3.3 配置 3.4 config 3.5 实体类 3.5 业务类 3.6 测试类 3. ...
- Spring事务传播机制与隔离机制
详情查看 https://www.jianshu.com/p/249f2cd42692 转载于:https://www.cnblogs.com/alan319/p/10937089.html
- Spring事务与事务传播机制
目录 1.事务的基本概念 2.Spring事务的实现 3.事务隔离级别 4.事务传播机制 1.事务的基本概念 关于事务的一些基础概念我已经在MYSQL中讲解过了,有不了解的可以移步至此篇文章: MyS ...
- JavaEE进阶 - Spring事务和事务传播机制 - 细节狂魔
文章目录 1.为什么需要事务?(回顾) 2.Spring 中事务的实现 MySQL 中的事务使用(回顾) 1.⼿动操作事务(编程式事务) 2. 声明式事务(利用注解自动开启和提交事务) @Transa ...
最新文章
- [CQOI2009]中位数图 详细题解
- python输入exit怎么退出了_Python 中的 exit() 和 sys.exit()
- 删除文件提示“您需要权限才能执行此操作”如何解决
- Tableau可视化分析实战系列Tableau基础概念全解析 (一)-数据结构及字段
- The python debugger调试(PDB)的简介
- linux网卡驱动 pdf,Linux下网卡驱动程序.pdf
- 纪中B组模拟赛总结(2019.12.21)
- linux weblogic java_options_使用Linux脚本更新Weblogic部署的应用程序
- Linux下安装Redis及使用
- 2010-11-23 network virtualization papers(2)
- 12V转3.3V稳压芯片7.4v转5V
- 秒杀于丹、蒋勋、蒙曼,每篇都有10万+的潜质。《六神磊磊读唐诗》,5星。
- 自然语言处理概述及流程
- python 文件格式转换_如何把txt文件转换成py文件
- Android SDK的级别
- PDF如何免费转Word
- 基于 Ubuntu 玩转 Hudi Docker Demo (2)—— 测试数据写入 Kafka
- IE无法上网,但其他浏览器可以
- Cheat Engine 在mac最新系统无法安装的解决办法
- 大型门户网站的十四大技术