以下是事物的传播机制:

@Transactional(propagation=Propagation.REQUIRED)
如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED)
容器不为这个方法开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW)
不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY)
必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER)
必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS)
如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.

举例说明

案例代码

ServiceA

ServiceA {   void methodA() { ServiceB.methodB(); } }

ServiceB

ServiceB { void methodB() { } }

1.PROPAGATION_REQUIRED

  假如当前正要运行的事务不在另外一个事务里,那么就起一个新的事务 比方说,ServiceB.methodB的事务级别定义PROPAGATION_REQUIRED, 那么因为执行ServiceA.methodA的时候,ServiceA.methodA已经起了事务。这时调用ServiceB.methodB,ServiceB.methodB看到自己已经执行在ServiceA.methodA的事务内部。就不再起新的事务。而假如ServiceA.methodA执行的时候发现自己没有在事务中,他就会为自己分配一个事务。这样,在ServiceA.methodA或者在ServiceB.methodB内的不论什么地方出现异常。事务都会被回滚。即使ServiceB.methodB的事务已经被提交,可是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚

2.PROPAGATION_SUPPORTS

  假设当前在事务中。即以事务的形式执行。假设当前不在一个事务中,那么就以非事务的形式执行

3PROPAGATION_MANDATORY

  必须在一个事务中执行。也就是说,他仅仅能被一个父事务调用。否则,他就要抛出异常

4.PROPAGATION_REQUIRES_NEW

  这个就比较绕口了。 比方我们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW。那么当运行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起。ServiceB.methodB会起一个新的事务。等待ServiceB.methodB的事务完毕以后,他才继续运行。
他与PROPAGATION_REQUIRED 的事务差别在于事务的回滚程度了。由于ServiceB.methodB是新起一个事务,那么就是存在两个不同的事务。假设ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚。ServiceB.methodB是不会回滚的。假设ServiceB.methodB失败回滚,假设他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。

5.PROPAGATION_NOT_SUPPORTED

  当前不支持事务。比方ServiceA.methodA的事务级别是PROPAGATION_REQUIRED 。而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED ,那么当执行到ServiceB.methodB时。ServiceA.methodA的事务挂起。而他以非事务的状态执行完,再继续ServiceA.methodA的事务。

6.PROPAGATION_NEVER

  不能在事务中执行。
如果ServiceA.methodA的事务级别是PROPAGATION_REQUIRED。 而ServiceB.methodB的事务级别是PROPAGATION_NEVER ,那么ServiceB.methodB就要抛出异常了。

7.PROPAGATION_NESTED

  如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

参考:https://www.cnblogs.com/dengpengbo/p/10425316.html

转载于:https://www.cnblogs.com/baizhanshi/p/10425467.html

spring事务的传播机制新解相关推荐

  1. Spring事务的传播机制

    spring事务的传播机制 1.spring事务 指封装在数据库事务之上的一种事务处理机制.其管理方法有两种,分别是编程式事务以及声明式事务.一般我们使用@Transactional进行声明式事务. ...

  2. spring手动控制事务开启_“上帝视角”图解Spring事务的传播机制原理

    转载:https://mp.weixin.qq.com/s/odP1DKgRtXsCcAKxwGahug 数据库事务的"抓手" 数据库的事务功能已经由数据库自身实现,它留给用户的就 ...

  3. spring事务的传播机制与事务挂起

    ·事务的传播机制:(不是JDBC事务管理)用来解决业务层的事务之间调用的问题.       PROPAGATION_REQUIRED     :支持(使用)当前事务,如果不存在事务就创建一个新事务 * ...

  4. Java中事务的传播机制和隔离级别

    一.传播机制 Spring事务的传播机制是指在方法调用链中,对于已经开启的事务以及后续子方法如何处理事务.Spring框架提供了7种传播行为来控制事务的传播过程,分别为: PROPAGATION_RE ...

  5. 【Spring源码】Spring Transactional事务:传播机制(Propagation) 介绍 和 源码剖析

    [Spring源码]Spring Transactional事务:传播机制(Propagation) 源码剖析 关键词 AMethod调用BMethod,转载BMethod的角度来考虑:站在被调用者的 ...

  6. spring事务的传播

    1.spring事务的传播 为什么会有传播机制 spring对事务的控制,是使用aop切面实现的 场景一:A调用B,都有事务,B异常,让B提交还是两个一起回滚 场景二:A调用B,A有事务,是够让B加入 ...

  7. 面试官:Spring事务的传播行为有几种?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:程序员入职国企,1周上班5小时,晒出薪资感叹:腾讯当CEO也不去个人原创+1博客:点击前往,查看更多 在Spri ...

  8. 数据库事务原理详解-Spring 事务的传播属性

    所谓spring 事务的传播属性,就是定义在存在多个事务同时存在的时候,spring 应该如何处理这些事务的行为.这些属性在TransactionDefinition 中定义,具体常量的解释见下表: ...

  9. Spring 事务的传播属性

    Spring 事务的传播属性 事务的传播属性: 1.PROPAGATION_REQUIRED * :如果不存在事务则新建事务,若存在事务则加入事务,默认是这个 2.PROPAGATION_SUPPOR ...

最新文章

  1. vb6中使text控件的光标随着增加的内容向下移动
  2. oracle 查看连接数
  3. Swift 和 Objective-C 混编
  4. 腾讯2020校园招聘---假期
  5. ONGC的完整形式是什么?
  6. 前端学习(2240):构造Vue的的利器-脚手架vue-cli3
  7. java版本streamgobbler_java调用本地命令 Runtime class's exec() method
  8. [转载] java-继承和多态
  9. 【差分隐私发论文朝哪个方向走?】差分隐私的过去,现在和将来
  10. 想要改变自己,请先突破这3个自我限制
  11. 7月目标 socket , 一致性哈希算法 ; mongodb分片; 分布式消息队列; 中间件的使用场景...
  12. HarmonyOS 组件篇
  13. 产品经理的段位——说说腾讯的产品职级
  14. webservice 完整视频教程
  15. 菊安酱的机器学习实战
  16. vue 实现点击图片放大
  17. Ubuntu18.04安装教程
  18. visual studio C++冒号:与双冒号::的使用说明
  19. uv纹理坐标设定与贴图规则
  20. ubuntu下解决微信不能发送图片的问题

热门文章

  1. linux shell脚本判断文件行数,判断文件是否存在的shell脚本代码
  2. linux必备工具,Linux装机必备工具
  3. html文件怎么导出stl文件,3D建模软件导出STL文件的小技巧(一)
  4. 怎么取消自动格式化_iPhone自动扣费怎么取消?App Store、微信、支付宝关闭自动扣费教程...
  5. 怎么检测mysql主从正常_使用pt-table-checksum检查主从复制是否正常
  6. html整体引入js,html页面用js引入js的方式
  7. linux命令提示符不同,Linux命令提示符如何按照自己的习惯修改?
  8. matlab 参数识别,[转载]自编最小二乘法的Matlab参数辨识程序(含实例)
  9. 变速后没有声音_问答 | 现代朗动at,启动后怠速不稳,热车后正常,是什么问题?...
  10. c++builder tadoquery存储过程_Electron桌面应用程序从创建项目、启动项目到打包程序的详细过程...