Spring 七种事务传播性介绍( 三 )

  • 方法B执行完毕后,恢复方法A的事务 , 最终提交事务 。
  • 调用链路过程:
    Spring 七种事务传播性介绍

    文章插图
    3.5 NEVER不支持事务
    当外层方法A开启了事务 , 方法B抛出异常
    Spring 七种事务传播性介绍

    文章插图
    例子:
    Spring 七种事务传播性介绍

    文章插图
    以上代码,两个方法都打上了事务注解 , 方法A的传播性是REQUIRED,方法B的传播性是NEVER 。
    具体执行过程:
    • 方法A开启事务,执行insert,没有提交 。
    • 含有事务的方法A调用方法B,方法B的传播性是NEVER,表示不支持事务,因此方法B抛出异常 。
    • 方法A的事务执行回滚 。

    Spring 七种事务传播性介绍

    文章插图
    3.6 MANDATORY必须在事务中执行 。
    如果外层方法A没有开启事务,方法B抛出异常 。
    Spring 七种事务传播性介绍

    文章插图
    如果外层方法A开启了事务,方法B加入事务 , 方法A&B在同一事务中执行 。
    Spring 七种事务传播性介绍

    文章插图
    例子:
    Spring 七种事务传播性介绍

    文章插图
    以上例子 , 方法A没有加事务注解,方法B 的传播性为 MANDATORY 。
    具体执行过程:
    • 方法A的调用方如果本身没有开启事务,方法A执行前不会开启事务 。
    • 当非事务方法A调用方法B时,由于方法B的传播性为MANDATORY,必须在事务中执行,条件不满足,抛出异常 。

    Spring 七种事务传播性介绍

    文章插图
    3.7 NESTED嵌套事务
    • 如果外层方法A不存在事务,内层方法B的规则与REQUIRED 一致 。
    • 如果外层方法A存在事务,内层方法B做为外层方法A事务的子事务执行,两个方法是一起提交,但子事务是独立回滚 。
      内层方法B抛出异常 , 则会回滚方法B的所有操作,但不影响外层事务方法A 。(方法A需要try-catch子事务,避免异常传递到父层事务)
      外层方法A回滚,则内层方法B也会回滚 。
    • 该传播性的特点是可以保存状态点,当回滚时 , 只会回滚到某一个状态点,保证了子事务之间的独立性 , 避免嵌套事务的全局回滚 。

    Spring 七种事务传播性介绍

    文章插图
    例子:
    Spring 七种事务传播性介绍

    文章插图
    以上例子,方法A的传播性为REQUIRED,方法B为NESTED 。
    具体执行过程:
    • 方法A执行时,如调用方没有开启事务,则开启一个事务 。
    • 方法B被外层方法A调用时,因为方法B的传播性为NESTED,方法B在此处建立savepoint,标记insert行为 。
    • 当方法B抛出异常,其insert操作会回滚,但只会回滚到savepoint,(前提是方法A要try-catch方法B,使方法B的异常不会往外传递) 。
    • 方法B回滚后,方法A的事务提交 。
    调用链路:
    Spring 七种事务传播性介绍

    文章插图
    四、总结本文解释了Spring框架中的事务传播性,即多个业务方法之间调用时事务如何处理的规则 。Spring提供了七种传播级别 , 如
    PROPAGATION_REQUIRED、
    PROPAGATION_REQUIRES_NEW等 。
    每种级别都有适用场景和限制,本文提供了一些示例,介绍了声明式事务如何使用,每种事务的规则,产生哪种行为,当方法抛出异常时,事务的提交和回滚是如何被处理的 。正确处理事务对于任何企业级应用程序都是必要的,了解Spring事务传播性是构建高效、可靠和可扩展应用程序的关键 。

    【Spring 七种事务传播性介绍】


    推荐阅读