1. 我对传播机制的理解

  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,注解演示)相关推荐

  1. spring上下文是什么意思_Java程序员只会CRUD连Spring事务传播机制都不懂?

    AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东西,面试完就 ...

  2. 原创 | CRUD更要知道的Spring事务传播机制

    来自:肥朝 AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东 ...

  3. Spring事务传播机制以及事务嵌套

    Spring事务传播机制以及事务嵌套 Spring事务传播机制 事务嵌套场景 情景0: 场景1:不同类中,开启事务的方法调用没有开启事务的方法 场景2:不同类中,methodA方法嵌套methodB方 ...

  4. Spring事务传播机制和隔离级别

    Spring有5种隔离级别,7种传播行为.这是面试常问的内容,也是代码中经常碰到的知识点.这些知识枯燥而且乏味,其中有些非常的绕.如果栽在这上面,就实在是太可惜了. @Transactional(is ...

  5. Spring 事务传播机制 实例讲解

    事务传播机制 对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011 spring的管理的事务可以分为如下2 ...

  6. Spring: 事务传播机制

    文章目录 1.美图 2.@Transactional 注解的属性信息 3.案例 3.1 建表 3.2 项目结构 3.3 配置 3.4 config 3.5 实体类 3.5 业务类 3.6 测试类 3. ...

  7. Spring事务传播机制与隔离机制

    详情查看 https://www.jianshu.com/p/249f2cd42692 转载于:https://www.cnblogs.com/alan319/p/10937089.html

  8. Spring事务与事务传播机制

    目录 1.事务的基本概念 2.Spring事务的实现 3.事务隔离级别 4.事务传播机制 1.事务的基本概念 关于事务的一些基础概念我已经在MYSQL中讲解过了,有不了解的可以移步至此篇文章: MyS ...

  9. JavaEE进阶 - Spring事务和事务传播机制 - 细节狂魔

    文章目录 1.为什么需要事务?(回顾) 2.Spring 中事务的实现 MySQL 中的事务使用(回顾) 1.⼿动操作事务(编程式事务) 2. 声明式事务(利用注解自动开启和提交事务) @Transa ...

最新文章

  1. [CQOI2009]中位数图 详细题解
  2. python输入exit怎么退出了_Python 中的 exit() 和 sys.exit()
  3. 删除文件提示“您需要权限才能执行此操作”如何解决
  4. Tableau可视化分析实战系列Tableau基础概念全解析 (一)-数据结构及字段
  5. The python debugger调试(PDB)的简介
  6. linux网卡驱动 pdf,Linux下网卡驱动程序.pdf
  7. 纪中B组模拟赛总结(2019.12.21)
  8. linux weblogic java_options_使用Linux脚本更新Weblogic部署的应用程序
  9. Linux下安装Redis及使用
  10. 2010-11-23 network virtualization papers(2)
  11. 12V转3.3V稳压芯片7.4v转5V
  12. 秒杀于丹、蒋勋、蒙曼,每篇都有10万+的潜质。《六神磊磊读唐诗》,5星。
  13. 自然语言处理概述及流程
  14. python 文件格式转换_如何把txt文件转换成py文件
  15. Android SDK的级别
  16. PDF如何免费转Word
  17. 基于 Ubuntu 玩转 Hudi Docker Demo (2)—— 测试数据写入 Kafka
  18. IE无法上网,但其他浏览器可以
  19. Cheat Engine 在mac最新系统无法安装的解决办法
  20. 大型门户网站的十四大技术

热门文章

  1. headshot速成迪丽热巴模型
  2. 凡客前副总张小军开服装B2C网站已获亿元风投
  3. Python + PySpider 抓取百度图片搜索的图片
  4. 织女星开发板RISC-V核通过SPI协议驱动ARDUINO LCD模块(触屏)
  5. vue使用svg画拓扑图(关系图) 拖拽 缩放
  6. 解决Jenkins权限配置错误,导致登录时出现没有Overall/read权限
  7. python知乎首页文章数据爬取
  8. Android 拨号键盘指令索引
  9. 2022第二届网刃杯网络安全大赛-Re
  10. 文本过长时中间部分用省略号表示。