美文网首页
Spring事务传播机制

Spring事务传播机制

作者: FrankDaddy | 来源:发表于2019-06-07 20:33 被阅读0次

在TransactionDefinition接口中定义了七个事务传播行为。
先说最常用的三个

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

如果上下文中已经存在事务,那么就加入到事务中执行,如果当前上下文中不存在事务,则新建事务执行。所以这个级别通常能满足处理大多数的业务场景

\color{red}{子事务回滚,父事务一定回滚}
\color{red}{父事务回滚,子事务一定回滚}

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

如果不起作用,可能的原因如下:调用方与被调用方写在了同一个service类里面,需要用Spring的上下文获取对象。
例如:((ABCServiceImpl) SpringContextHolder.getBean("注册的标识符"))

PROPAGATION_NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。

\color{red}{子事务回滚到savepoint,父事务科选择性回滚或者不回滚}
\color{red}{父事务回滚,子事务一定回滚}

其他四个

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

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

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

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

通常我们只会用到@Transactional(propagation = Propagation.REQUIRED)。
在特殊需求的时候需要在一个方法内部提前提交一部分事务或者是让内部的一段代码处于单独的一个事务管理的时候需要用到REQUIRES_NEW。

例如下面示例中的methodA需要单独开启事务,不受调用方法事务的回滚而回滚:

@transaction    
public void testMethod(){
     dosomethingBefore...
     methodA();
     dosomgthingAfter...
} 

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodA(){
     updateSomething();
} 

假设我们在Controller直接调用testMethod() Spring会帮我们开启一个事务
运行到methodA()这行的时候会挂起当前事务,然后重新创建一个事务,在methodA()中没有发生异常的情况下,运行完methodA方法直接提交methodA的事务;后续再执行dosomgthingAfter。
总共会有4种情况:

  1. dosomethingBefore发生异常,这时methodA()未运行也就没有事务,直接回滚testMethod()的事务。
  2. updateSomething发生异常,回滚methodA()的事务,此时如果testMethod()对这个异常进行了try catch捕获,testMethod的事务照常提交。
  3. updateSomething发生异常,回滚methodA()的事务,此时如果testMethod()没有对这个异常进行try catch捕获,那么methodA和testMethod的事务都会回滚。
  4. 前面全部正常 dosomgthingAfter 发生异常,这时methodA()事务已经提交 testMethod()所做的修改会回滚。

而Spring中的@Transactional(rollbackFor = Exception.class)事务处理,当你的方法中抛出异常时,它会将
事务回滚,数据库中的数据将不会改变,也就是回到进入此方法前的状态。

相关文章

  • Spring 事务

    ** 但是Spring事务有自己的特点,也就是事务传播机制。** ** 所谓事务传播机制,也就是在事务在多个...

  • SSM spring 2

    1 Spring 事务实现方式、事务的传播机制、默认的事务类别 Spring事务的1+3种实现方式、7种传播行为、...

  • 问题记录

    面试题记录 spring spring事务传播机制和隔离级别? spring支持的事务类型? 什么是 Spring...

  • #30天专注成长计划# day18 Spring事务机制2-事务

    Spring事务机制传播主要由TransactionDefinition完成,在TransactionDefini...

  • 有关Spring事务,看这一篇就足够了

    本文将按照声明式事务的五个特性进行介绍: 事务传播机制 事务隔离机制 只读 事务超时 回滚规则 Spring事务传...

  • 十六、spring事务之事务传播机制和隔离级别

    Spring事务传播行为 运用Spring事务,必须要深入理解它的传播机制,否则会遇到各种意想不到的坑,Sprin...

  • 2、spring事物的传播机制与隔离级别

    Spring事务传播行为 运用Spring事务,必须要深入理解它的传播机制,否则会遇到各种意想不到的坑,Sprin...

  • Spring事务传播机制

    开发中有多个事务方法嵌套调用时,就涉及到了 Spring 的事务传播机制。 下面梳理一下 7 种传播机制的含义,做...

  • Spring事务传播机制

    传播性行为分为以下几种 PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务...

  • Spring事务传播机制

    在TransactionDefinition接口中定义了七个事务传播行为。先说最常用的三个 PROPAGATION...

网友评论

      本文标题:Spring事务传播机制

      本文链接:https://www.haomeiwen.com/subject/uhuvxctx.html