Spring嵌套事务

Spring 事务传播属性如下

  •     PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  •   PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
  •   PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
  •   PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
  •   PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  •     PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
  •     PROPAGATION_NESTED--

拿以下代码分析Spring 嵌套事务

    ServiceA {  

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

    }  

    ServiceB {  

         void methodB() {
         }  

    }  

案例1,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED,

1、如果ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,会共用同一个事务,如果出现异常,ServiceA.methodA和ServiceB.methodB作为一个整体都将一起回滚。

2、如果ServiceA.methodA没有事务,ServiceB.methodB就会为自己分配一个事务。ServiceA.methodA中是不受事务控制的。如果出现异常,ServiceB.methodB不会引起ServiceA.methodA的回滚。

案例2,ServiceA.methodA的事务级别PROPAGATION_REQUIRED,ServiceB.methodB的事务级别PROPAGATION_REQUIRES_NEW,

调用ServiceB.methodB,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务。

1、如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。

2、如果ServiceB.methodB失败回滚,如果他抛出的异常被ServiceA.methodA的try..catch捕获并处理,ServiceA.methodA事务仍然可能提交;如果他抛出的异常未被ServiceA.methodA捕获处理,ServiceA.methodA事务将回滚。

案例3,ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_NESTED,

调用ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的子事务并设置savepoint

1、如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB也将回滚。

2、如果ServiceB.methodB失败回滚,如果他抛出的异常被ServiceA.methodA的try..catch捕获并处理,ServiceA.methodA事务仍然可能提交;如果他抛出的异常未被ServiceA.methodA捕获处理,ServiceA.methodA事务将回滚。

原文地址:https://www.cnblogs.com/mcahkf/p/9228609.html

时间: 2024-10-08 20:50:21

Spring嵌套事务的相关文章

Spring嵌套事务控制

A类   callBack_test() B类   testadd() C类   select(),得查询到B类testadd方法中新增的数据.以及初始化一些属性 场景:A类 嵌套 B类  B类嵌套C类:都是由spring控制事务. 要求:B类testadd方法中不受spring事务控制,单独新开个事务运行,可以使C类查询的到. 问题:A类是系统底层方法,必须受事务控制.且C类必须查询到刚刚add的数据. 分析:初步分析为:Spring事务传播性导致的,从A类开启的事务,就有完结.为了避免这样的

知识点:Spring嵌套事务方式

Spring遇到嵌套事务时,怎么实现 实验时却遇到一个奇怪的问题: 1.当ServiceA.a()方法调用ServiceB.b()方法时,内层事务提交和回滚,都不受外层事务提交或回滚的影响. 2.当ServiceA.a()方法调用ServiceA.c()方法时,内层事务不能正确地提交或回滚. 如下: xxxServiceA类中,有如下两个方法. @Transactional method_One() { method_Two(); } @Transactional(propagation = P

spring 嵌套事务问题

嵌套事物总结 事物成功总结 1.内外都无try Catch的时候,外部异常,全部回滚. 2.内外都无try Catch的时候,内部异常,全部回滚. 3.外部有try Catch时候,内部异常,全部回滚 4.内部有try Catch,外部异常,全部回滚 5.友情提示:外层方法中调取其他接口,或者另外开启线程的操作,一定放到最后!!!(因为调取接口不能回滚,一定要最后来处理) 总结:由于上面的异常被捕获导致,很多事务回滚失败.如果一定要将捕获,请捕获后又抛出RuntimeException(默认为异

spring事物传播机制与隔离级别

转载自:http://www.blogjava.net/freeman1984/archive/2010/04/28/319595.html7个传播行为,4个隔离级别, Spring事务的传播行为和隔离级别[transaction behavior and isolated level]2007-08-01 16:33事务的传播行为和隔离级别[transaction behavior and isolated level] Spring中事务的定义:一.Propagation : key属性确定

spring中涉及事务(bean中ref与local)

<bean id="接口" parent="父id"> <property name="target"> <ref local="实现" /> </property> </bean> <bean id="实现" class="实现类的全路径"> <property name="成员变量"&g

Spring事务管理中@Transactional

最近写的一个消息推送的接口,供订单生成后调用,发现每次传过来的时候订单id是存在的,可是利用订单id去查订单信息做后续操作时发现查不到数据,最终发现是订单生成时候业务处理写在service层,加了Spring的事务处理的相关参数: @Transactional(value="txManager",isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,rollbackFor={Exception.class}) 而紧接着

深入理解事务--Spring事务的传播机制

https://blog.csdn.net/yuanlaishini2010/article/details/45792069 事务的嵌套概念 所谓事务的嵌套就是两个事务方法之间相互调用.spring事务开启 ,或者是基于接口的或者是基于类的代理被创建(注意一定要是代理,不能手动new 一个对象,并且此类(有无接口都行)一定要被代理--spring中的bean只要纳入了IOC管理都是被代理的).所以在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的. ### Spring默认情况

SpringAOP和Spring事物管理

Spring AOP : Pointcut表达式: designators-指示器 wildcards-通配符 operators-操作符 wildcards: * -- 匹配任意数量的字符 + -- 匹配制定类及其子类 ..-- 一般用于匹配任意数的子包或参数 operator: && || ! Wildcards(通配符) * 匹配任意数量的字符 + 匹配指定类及其子类 .. 一般用于匹配任意数的子包或参数 Pointcut :切面表达式 designators:指示器,描述通过什么方

[转]事务传播

原文链接:事务的传播行为(讲得比较好) (2011-11-14 17:12:48) 转载▼ 标签: 杂谈 分类: 数据库 文章一: 我们都知道事务的概念,那么事务的传播特性是什么呢?(此处着重介绍传播特性的概念,关于传播特性的相关配置就不介绍了,可以查看spring的官方文档) 在我们用SSH开发项目的时候,我们一般都是将事务设置在Service层 那么当我们调用Service层的一个方法的时候它能够保证我们的这个方法中执行的所有的对数据库的更新操作保持在一个事务中,在事务层里面调用的这些方法要