spring 事务 传播机制 描述的 事务方法直接相互调用,父子事物开启,挂起,回滚 等的处理方式。 绿色的 那几个 我认为比较重要。

1 , @Transactional(propagation=Propagation.REQUIRED)  默认值 等于 @Transactional

   有父方法传递过来的 事务环境,就在使用父方法的事务环境,如果父方法没有事务环境,那么就用新开启一个事物。

   备注:非事务执行的意思是单条sql就提交。

  例子设置: A 方法调用 B,C两个子方法。C执行后在C的方法中抛出异常

    情景1  条件:A 什么都不加,B 什么都不加,C,Propagation.REQUIRED ,

        结果:C 执行以后抛出异常。结果 B能写入 ,C写入的被回滚。

    解析:A,B都是非事物环境,C起了一个新的事务。 

    

    情景2  条件:A 加 @Transactional ,B 什么都不加,C,Propagation.REQUIRED ,

        结论:B C 的操作都回滚了

    解析:B,C都是用的 A开启的事务环境,C的时候抛出异常, 全部回滚。

  关键字:有就用,没有就新建一个

2 ,@Transactional( propagation=Propagation.SUPPORTS)

  如果父方法没有事物换机,那么当前方法就使用非事务环境执行,如果 有,就使用父方法的事务环境。 这个和不写几乎一样 @Transactional

  例子设置: A 方法调用 B,C两个子方法。C执行后在C的方法中抛出异常

    情景1  条件:A 什么都不加,B 什么都不加,C,Propagation.SUPPORTS,

        结果:B,C 都能写入成功

    解析:ABC,都是非事务环境 

    

   情景2  条件:A @Transactional ,B 什么都不加,C,Propagation.SUPPORTS,

        结果:B,C 都能写入后都回滚了,

    解析:ABC,都处于A开启的事务环境。

  关键字:有就用,没有就不用

3 @Transactional(propagation=Propagation.MANDATORY)

   当前方法必须处于事物环境才能执行。

 例子设置: A 方法调用 B,C两个子方法。

    情景1  条件:A 什么都不加,B 什么都不加,C,Propagation.MANDATORY,

        结果:执行C的时候抛出异常( No existing transaction found for transaction marked with propagation 'mandatory' )

    解析:C 需要事物环境才能执行

    

   情景2  条件:A @Transactional ,B 什么都不加,C,Propagation.MANDATORY,

        结果: 正常执行到

    解析:C 需要事物环境才能执行

  关键字:必须要父类给我一个事务环境

4 @Transactional(propagation=Propagation.REQUIRES_NEW)

   必定要新开启一个事务。

 例子设置: A 方法调用 B,C两个子方法。C执行后在C的方法中抛出异常

    情景1  条件:A 什么都不加,B 什么都不加,C,Propagation.REQUIRES_NEW,

        结果:B 能写入,C 写入后被回滚了。

    解析:在父类没有事务环境的情况下,C启动了一个新的事务

    

   情景2  条件:A @Transactional ,B 什么都不加,C,Propagation.REQUIRES_NEW,

        结果: B,C都没有写入数据

    解析: 明显C 让父类事务一起回滚了。C如果 回滚,父类事物也会回滚。

  情景3  条件:A @Transactional ,B 什么都不加,C,Propagation.REQUIRES_NEW, 去掉 C执行后在C的方法中抛出异常,在A中 执行完C后抛出异常。

        结果: B的数据没写进去,C的数据写进去;额

    解析: B 使用的A开启的事物 ,C 开启了一个新事物。并且C执行完成以后就提交了,A 里面的异常让B一起回滚了。

  关键字:新建一个,父回滚子不回滚,子回滚,父也会滚。 并且子事物是在 子方法完成的时候提交的。

5 @Transactional(propagation=Propagation.NOT_SUPPORTED)

   当前方法一定不回用在事务环境执行,如果父类有事务,那么就先把它挂起。 和  REQUIRED 是相反的。

 例子设置: A 方法调用 B,C两个子方法。C执行后在C的方法中抛出异常

    情景1  条件:A @Transactional,B 什么都不加,C,Propagation.NOT_SUPPORTED,

        结果:B没有写入,C能写入。

    解析:B 写入了,然后被 C里面的 抛出的异常 给触发回退了,C 里面是非事执行,能够正常写入。

  关键字:不会在事务环境执行

6  @Transactional(propagation=Propagation.NEVER)

   和  MANDATORY 相反 ,这个方法只能执行在非事务环境,如果父类有事物,就抛出异常

 例子设置: A 方法调用 B,C两个子方法

    情景1  条件:@Transactional ,B 什么都不加,C,Propagation.NEVER,

        结果:抛出异常(Existing transaction found for transaction marked with propagation 'never')

    解析:NEVER 的父方法不能有 事物环境。

  关键字:父层不能有事务

7  @Transactional(propagation=Propagation.NESTED)

   内嵌事物,在没有外部事务 的时候 和 REQUIRED 一样, 这个和  Propagation.REQUIRES_NEW 容易混淆 ,Propagation.REQUIRES_NEW 是挂起父事物,然后新启动一个事物,新的事务完成后先提交,新事物回滚,父事物一起回滚,

    Propagation.NESTED 是在 父环境有事物的时候,会做一个保存点,然后在 如果 当前方法抛出异常,就回滚到保存点,如果 父事物 回滚,当前方法里面的写操作也回滚,而且本质上只有一个事物,所以在父方法事物提交的时候提交。

 例子设置: A 方法调用 B,C两个子方法,C方法内部执行完成以后抛出异常

    情景1  条件:@Transactional ,B 什么都不加,C,Propagation.NEVER,

        结果: B 没有写入成功,C也没有写入成功。

    解析:.这个结果和 REQUIRES_NEW 类似,不做解释,后面进一步确认。

    

    

   情景2  条件:@Transactional ,B 什么都不加,C,Propagation.NEVER, ,但是抛异常的位置改成A方法内部,C方法调用以后。

        结果: B 没有写入成功,C也没有写入成功。

    解析:综合和上面2个例子。NESTED 内层事物回滚,外层也会滚,外层回滚内层也会回滚。并且内层事物提交的 时间节点是和外层事务 一起提交。

  关键字:父子同步回滚,父子一起提交

备注:sharding JDBC  不支持  @Transactional(propagation=Propagation.NESTED)

 

spring 事务传播机制的更多相关文章

  1. spring事务传播机制实例讲解

    http://kingj.iteye.com/blog/1680350   spring事务传播机制实例讲解 博客分类:   spring java历险     天温习spring的事务处理机制,总结 ...

  2. Spring事务传播机制和数据库隔离级别

    Spring事务传播机制和数据库隔离级别 转载 2010年06月26日 10:52:00 标签: spring / 数据库 / exception / token / transactions / s ...

  3. Spring事务传播机制与隔离级别(转)

    Spring事务传播机制与隔离级别 博客分类: Spring   转自:http://blog.csdn.net/edward0830ly/article/details/7569954 (写的不错) ...

  4. 面试突击87:说一下 Spring 事务传播机制?

    Spring 事务传播机制是指,包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的. 既然是"事务传播",所以事务的数量应该在两个或两个以上,Spring 事务传播机制的 ...

  5. Spring事务传播机制

    Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播,即协调已经有事务标识的方法之间的发生调用时的事务 ...

  6. spring事务传播机制的测试结果

    /**     * @Component是个一般性的注解,使用此注解修饰的POJO类,有value属性,指定bean的id.也可不写.默认值是类名首字母小写     * @Resource是控制依赖注 ...

  7. 18个示例详解 Spring 事务传播机制(附测试源码)

    什么是事务传播机制 事务的传播机制,顾名思义就是多个事务方法之间调用,事务如何在这些方法之间传播. 举个例子,方法 A 是一个事务的方法,方法 A 执行的时候调用了方法 B,此时方法 B 有无事务以及 ...

  8. Spring事务传播机制&隔离级别

    一.Propagation (事务的传播属性) Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为.有以下选项可供使用:PROPAGATION_ ...

  9. spring事务传播机制与隔离级别、通知类别

    Spring在TransactionDefinition接口中规定了7种类型的事务传播行为, 它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 事务传播行为类型 说明 PROPAGATIO ...

随机推荐

  1. python基础(内存分析,不引入第三方变量的方式交换变量的值)

    a,b指向同一块内存地址 下面方法是重新给b赋值;a,b指向不同的内存地址 字符串或int类型内存分析 不引入第三方变量的方式,交换a,b的值

  2. 前端开发【第四篇: Dom操作】

    文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM把 ...

  3. makefile笔记5 - makefile变量

    在 Makefile 中的定义的变量,就像是 C/C++语言中的宏一样,他代表了一个文本字串,在 Makefile 中执行的时候其会自动原模原样地展开在所使用的地方.其与 C/C++所不同的是,你可以 ...

  4. jdk环境变量配置改变不生效的问题

    在工作中两次遇到jdk配置上的这个问题:将环境变量中的jdk路径修改之后,使用-version查看,版本号还是之前的,也就是说修改未生效.甚至当我将Path变量中的jdk路径配置都删除了之后,使用-v ...

  5. windows 下安装MySQL 服务无法启动类问题

    解决方案: 1 执行 mysqld.exe -nt remove 2 执行 mysqld --initialize(中间是两个中划线) 3 执行 mysqld.exe -nt install 4 执行 ...

  6. VMSTAT监控CPU使用率,内存使用,虚拟内存交换情况

    Linux性能监控分析命令(一)—vmstat命令详解 一.vmstat介绍 语法格式: vmstat [-V] [-n] [-S unit] [delay [count]] -V prints ve ...

  7. 玩转BLE(3)_使用微信蓝牙精简协议伪造记步数据

    1. 前言 在物联网时代,有一个问题肯定会让人头疼(现在已经初露端倪了): 物联网中的IOT设备有两个主要特点: 1)简单小巧(不具备复杂的人机交互接口,需要手机等终端设备辅助完成配置.控制等功能). ...

  8. 大数据 - hadoop - HDFS+Zookeeper实现高可用

    高可用(Hign Availability,HA) 一.概念 作用:用于解决负载均衡和故障转移(Failover)问题. 问题描述:一个NameNode挂掉,如何启动另一个NameNode.怎样让两个 ...

  9. 使用min-device-pixel-ratio媒体功能实现真正的1像素border

    关于设备像素比的知识,想必做过移动端开发的都有接触,这里就不介绍啦,万一有不懂的可以看张鑫旭大神的设备像素比devicePixelRatio简单介绍 由于设备像素比存在的原因,我们在处理设计图的一些边 ...

  10. PX转REM简易计算器(适用于fittext.js插件计算)

    当你使用fittext.js插件时,通过量取的像素单位PX计算出REM单位值,是一件比较麻烦而繁琐的,为了提高工作效率,自己闲暇写了个小DEMO,现在给大家分享出来. 先看dom: <heade ...