继上一篇文章,我们讲到了事务的传播行为,具体是那七个。我们在罗列一遍:

PROPAGATION_REQUIRED

如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
PROPAGATION_SUPPORTS

如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。
PROPAGATION_MANDATORY

如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
PROPAGATION_REQUIRES_NEW

总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
PROPAGATION_NOT_SUPPORTED

总是非事务地执行,并挂起任何存在的事务
PROPAGATION_NEVER

总是非事务地执行,如果存在一个活动事务,则抛出异常

PROPAGATION_NESTED

如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行
我们就转账例子说一下。 比如,在转账的services中有个两个方法,方法A和方法B。

方法A
 ServiceA { 
        read A =100  ;   
        If(doSome()){
                               A = A + 1;  
                           }else{
                               A = A - 1;  
                          }
        Update A;
        Commit;       
          }   
1
2
3
4
5
6
7
8
9
10
方法B
ServiceB {                 
         void doOther() {
                 read B ;
                 B = B – 1;
                Update B;
                  If(B>0){
                Commit;
                Return ture;
                  }else{
                     Rollback;
                Return false;
                  }
       }
1
2
3
4
5
6
7
8
9
10
11
12
13
(1)REQUIRED——必须有事务
指定的方法必须在事务内执行。若当前存在事务,就加入到当前事务中;若当前没有事务,则创建一个新事务。这种传播行为是最常见的选择,也是Spring默认的事务传播行为。

比如说,Servicedo的doOther()方法上加上了传播行为PROPAGATION_REQUIRED。若doSome()方法在调用doOther()方法时就是在事务内运行的,则doOther()方法的执行也加入到该事务内执行。若doSome()方法在调用doOther()方法时没有在事务内执行,则doOther()方法会促使doSome()创建一个事务,并在加入其中执行。在doSome()或者在doOther()内的任何地方出现异常,事务都会被回滚。即使doOther()的事务已经被提交,doSome()在接下来fail要回滚,doOther()也要回滚。

简单来说,谁调加了REQUIRED的方法,谁就要具有一个事务,被调用的方法可有可无事务,但是调他的必须有事务

(2)SUPPORTS ——支持事务
指定的方法支持当前事务,但若当前没有事务,也可以以非事务方式执行。 定义在再方法doOther()上,定义在doSome()上。

(3)MANDATORY ——托管事务
指定的方法必须在当前事务内执行。就是说,他只能被一个父事务调用。若当前没有事务,则直接抛出异常。 定义在再方法doOther()上,定义在doSome()上。doSome()是father。

(4)REQUIRES_NEW ——需要新事务
总是新建一个事务,若当前存在事务,就将当前事务挂起,直到新事务执行完毕。

比如,我们设计ServiceA.doSome()的事务级别为PROPAGATION_REQUIRED,ServiceB.doOther()的事务级别为PROPAGATION_REQUIRES_NEW,那么当执行到ServiceB.doOther()的时候,ServiceA.doSome()所在的事务就会挂起,ServiceB.doOther()会起一个新的事务,等待ServiceB.doOther()的事务完成以后,他才继续执行。

优先级别:PROPAGATION_REQUIRES_NEW >PROPAGATION_REQUIRES

PROPAGATION_REQUIRED与PROPAGATION_REQUIRED 的事务区别:在于事务的回滚程度。因为ServiceB.doOther()是新起一个事务,那么就是存在两个不同的事务。如果ServiceB.doOther()已经提交,那么ServiceA.doSome()失败回滚,ServiceB.doOther()是不会回滚的。如果ServiceB.doOther()失败回滚,如果他抛出的异常被ServiceA.doSome()捕获,ServiceA.doSome()事务仍然可能提交。

(5)NOT_SUPPORTED ——不支持事务
指定的方法不能在事务环境中执行,若当前存在事务,就将当前事务挂起。 
比如ServiceA.doSome()的事务级别是PROPAGATION_REQUIRED ,而ServiceB.doOther()的事务级别是PROPAGATION_NOT_SUPPORTED ,那么当执行到ServiceB.doOther()时,ServiceA.doSome()的事务挂起,而他以非事务的状态运行完,再继续ServiceA.doSome()的事务。一般,在非常耗时查询的时候就可以使用Not Support,挂起这个查询方法,让其他方法先行,避免事务时间超长。

优先级别:PROPAGATION_NOT_SUPPORTED>PROPAGATION_REQUIRED

(6)NEVER ——禁用事务
指定的方法不能在事务环境下执行,若当前存在事务,就直接抛出异常。 
假设ServiceA.doSome()的事务级别是PROPAGATION_REQUIRED,而ServiceB.doOther()的事务级别是PROPAGATION_NEVER ,那么ServiceB.doOther()就要抛出异常了。 
简而言之:事务掉了拥有NEVER属性的方法统统要出错。 
优先级别:PROPAGATION_NEVER>PROPAGATION_REQUIRED

(7)NESTED ——嵌套事务
指定的方法必须在事务内执行。若当前存在事务,则在嵌套事务内执行;若当前没有事务,则创建一个新事务。并且使用savepoint设置事务的回滚点。

那怎么使用savapoint()的,看下面这个例子

savapoint()使用
ServiceA {        
     void doSome() {   
         try {
      //savepoint   
             ServiceB.doOther();    //PROPAGATION_NESTED 级别
         } catch (SomeException) {   
             // 执行其他业务, 如 ServiceC.doElse()等等
         }   
     }   
  }   
1
2
3
4
5
6
7
8
9
10
加入,ServiceB.doOther()失败回滚,那么ServiceA.doSome() 也会回滚到savepoint点上,ServiceA.doSome() 可以选择另外一个分支,比如ServiceC.doElse(),继续执行,来尝试完成自己的事务。

PROPAGATION_Nested与PROPAGATION_REQUIRES_NEW的区别是:PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。
--------------------- 
作者:童小绿 
from:https://blog.csdn.net/tsj11514oo/article/details/52389124?utm_source=copy

事务457——事务的七个传播行为相关推荐

  1. 数据事务四种隔离机制和七种传播行为

    数据事务四种隔离机制和七种传播行为 一.隔离级别: 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Seria ...

  2. Spring五个事务隔离级别和七个事务传播行为

    Spring五个事务隔离级别和七个事务传播行为 1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数 ...

  3. 事务隔离级别和传播行为_Spring五个事务隔离级别和七个事务传播行为

    Isolation 属性一共支持五种事务修改,具体介绍如下: l DEFAULT 使用设置的防护级别 ( 默认 ) ,由 DBA 默认的设定来决定隔离级别 . l READ_UNCOMMITTED 会 ...

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

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

  5. 什么是事务、事务特性、事务隔离级别、spring事务传播特性

    1.什么是事务: 事务是指程序中的一个操作序列.其特点是:该序列的所有操作要么全部成功完成,要么只要有一个操作失败,则该序列所有操作都将被撤销.这也是事务的原子性(要么成功,要么失败). 2.事务特性 ...

  6. Spring高级之Spring事务详解(用法、传播行为、隔离级别、只读事务、事务条件)

    前言 这是之前开始学spring的时候的笔记,现在添加了一些理解,然后把他搬到博客上来. 事务概述: 这里仅对数据库事务进行一个概述,要详细的可以查询相关文章 在JavaEE企业级开发的应用领域,为确 ...

  7. JavaEE_Spring_Spring中的事务声明, 事务隔离和事务传播等

    最近面试经常被问到事务的隔离与事务传播等方面的知识,现在留下一篇博文整理了网上几篇博文的资料.记录一下 0.Spring中的事务以及事务声明 这里只讲解Spring中的事务,对于SQL事务的概念以及A ...

  8. 分布式事务最经典的七种解决方案

    作者:叶东富 来源:https://segmentfault.com/a/1190000040321750 随着业务的快速发展.业务复杂度越来越高,几乎每个公司的系统都会从单体走向分布式,特别是转向微 ...

  9. 技术圈儿001---分布式事务最经典的七种解决方案

    随着业务的快速发展.业务复杂度越来越高,几乎每个公司的系统都会从单体走向分布式,特别是转向微服务架构.随之而来就必然遇到分布式事务这个难题,这篇文章总结了分布式事务最经典的解决方案,分享给大家. ◆  ...

最新文章

  1. 拿下中科大的计算机课程全靠它了!
  2. 零基础如何学好Python?Python有哪些必须学的知识?
  3. VTK:Shaders之ColorByNormal
  4. 智能机器人建房子后房价走势_明后年日照房价走势如何?究竟是“上涨”还是下降...
  5. linux之用2张图片描述vim常见命令
  6. 微信H5 回调_PHP实现微信H5支付
  7. windows查询每个线程占用的内存_C#多线程
  8. 微信公众号开发之创建菜单栏代码示例(php)
  9. 2台电脑一根网线传文件_黑龙江工程专用网线报价,黑电源线配件厂家
  10. TextBar for Mac(菜单栏增强工具)支持m1
  11. 2019年末逆向复习系列之从猫眼字体反爬分析谈谈字体反爬的前世今生
  12. 官方指南:小米手机微信双开
  13. 1016 Phone Bills (25分)
  14. 42个5G智慧教育应用场景,告诉你5G将如何改变教育
  15. 写在2016的尾巴上
  16. 关于7Z自解压文件拆分,读取条目,复写,合并的功能
  17. 生成数字相加验证码图片并验证
  18. Luogu P4844 LJJ爱数数
  19. 迁移率 计算方法及用途 风控建模系列 02
  20. 有没有办法找回testflight之前测试的软件_关于TestFlight ,你需要知道这些

热门文章

  1. spring mvc DispatcherServlet详解前传---HttpServletBean类
  2. Hudson-ci/Using Hudson/Installing Hudson/Installing Hudson RPM--官方文档
  3. 【大数据-Hadoop】Spark
  4. 巨杉数据库 CTO 王涛:区块链+数据库,底层技术融合是否带来更大爆发?
  5. 京东发力金融AI,欲再招50位金融AI顶级科学家 转载 2017年12月04日 00:00:00 42 12月1日,京东金融AI实验室在美国硅谷正式投入运营。亦在同一天,京东金融宣布,美国伊利诺伊大
  6. 深入理解分布式技术 - 如何确保高可用
  7. 饿了吗app都是用html写的,Vue2.0仿饿了么webapp单页面应用详细步骤
  8. php 限制登陆设备,登陆界面限制到只允许一台机器在线-PHP教程,PHP应用
  9. Android系统system文件夹结构的说明 \system下的app、lib、bin、etc、fonts、framework
  10. pyqt5教程9:Widgets组件