• Spring 事务传播行为


    目录

    前言

    一、spring事务传播行为是什么?

    二、Spring事务传播行为的七种类型。

    ?三、注意事项。

    1. 调用者和被调用者都没发生异常。

    2. 调用者调用完当前方法后,调用者抛出业务异常,怎么回滚?

    3. 当前方法发生异常,调用者捕获当前方法的业务异常,怎么回滚?

    4. 当前方法发生异常,调用者不捕获当前方法的异常,怎么回滚?

    总结


    前言

    随着spring框架的不断发展,spring框架也越来越重要,很多人都开启了spring框架学习,本文就介绍了spring框架中的一个基础内容------spring事务传播行为。


    一、Spring事务传播行为是什么?

    事务传播行为指的就是当一个事务方法(当前事务)被另一个事务方法(调用者)调用时,这个事务方法(当前事务)对另一个事务方法(调用者)的态度。

    简单说就是:事务方法A调用了事务方法B,B需要怎么应对。

    二、Spring事务传播行为的七种类型。

    事务传播行为类型

    说明

    PROPAGATION_REQUIRED

    表示当前方法必须在事务中运行。

    如果调用者有事务,则当前方法加入到调用者事务中运行。

    如果调用者没有事务,则当前方法自己新开启一个事务运行。

    PROPAGATION_SUPPORTS

    表示当前方法不必在事务中运行。

    如果调用者有事务,则当前方法加入到调用者事务中运行。

    如果调用者没有事务,则当前方法以非事务的形式运行。

    PROPAGATION_MANDATORY

    表示当前方法必须在调用者事务中运行。

    如果调用者有事务,则当前方法加入到调用者事务中运行。

    如果调用者没有事务,则当前方法抛出异常。

    PROPAGATION_NESTED

    表示当前方法必须在事务中运行。

    如果调用者有事务,则当前方法以“嵌套事务”的形式加入到调用者事务中运行。

    如果调用者没有事务,则当前方法自己新开启一个事务运行。

    PROPAGATION_NEVER

    表示调用者必须以非事务形式运行。

    如果调用者有事务,则抛出异常。

    如果调用者没有事务,则当前方法以非事务的形式运行。

    PROPAGATION_REQUIRES_NEW

    表示当前方法必须在事务中运行。

    如果调用者有事务,则当前方法自己新开启一个事务运行。

    如果调用者没有事务,则当前方法当前方法自己新开启一个事务运行。

    PROPAGATION_NOT_SUPPORTED

    表示当前方法不支持在事务中运行。

    如果调用者有事务,则挂起调用者的事务,当前方法以非事务的形式运行。

    如果调用者没有事务,则当前方法以非事务的形式运行。

    三、注意事项。

    1. 调用者和被调用者都没发生异常。

    事务传播行为类型

    调用者是否存在事务

    结果

    PROPAGATION_REQUIRED

    当前方法加入调用者的事务。

    当前方法自己新开启一个事务运行。

    PROPAGATION_SUPPORTS

    当前方法加入调用者的事务。

    当前方法以非事务的形式运行。

    PROPAGATION_MANDATORY

    当前方法加入调用者的事务。

    调用者调用当前方法时,抛出Spring异常。

    (不允许存在该场景)

    PROPAGATION_NESTED

    当前方法以”嵌套事务“的形式加入调用者的事务。

    当前方法自己新开启一个事务运行。

    PROPAGATION_NEVER

    调用者调用当前方法时,抛出Spring异常。

    (不允许存在该场景)

    当前方法以非事务的形式运行。

    PROPAGATION_REQUIRES_NEW

    当前方法自己新开启一个事务运行。

    当前方法自己新开启一个事务运行。

    PROPAGATION_NOT_SUPPORTED

    当前方法以非事务的形式运行。

    当前方法以非事务的形式运行。

    2. 调用者调用完当前方法后,调用者抛出业务异常,怎么回滚?

    事务传播行为类型

    调用者是否存在事务

    结果

    PROPAGATION_REQUIRED

    当前方法加入调用者的事务。

    调用者抛出异常后,一起回滚。

    当前方法自己新开启一个事务运行。

    调用者抛出异常后,调用者已执行的SQL不回滚。

    当前方法的事务不回滚。

    PROPAGATION_SUPPORTS

    当前方法加入调用者的事务。

    调用者抛出异常后,调用者和当前方法一起回滚。

    当前方法以非事务的形式运行。

    调用者抛出异常后,调用者已执行的SQL不回滚。

    当前方法已执行的SQL不回滚。

    PROPAGATION_MANDATORY

    当前方法加入调用者的事务。

    调用者抛出异常后,调用者和当前方法一起回滚。

    调用者调用当前方法时,抛出Spring异常。

    (不允许存在该场景)

    PROPAGATION_NESTED

    当前方法以”嵌套事务“的形式加入调用者的事务。

    调用者抛出异常后,调用者和当前方法一起回滚。

    当前方法自己新开启一个事务运行。

    调用者抛出异常后,调用者已执行的SQL不回滚。

    当前方法的事务不回滚。

    PROPAGATION_NEVER

    调用者调用当前方法时,抛出Spring异常。

    (不允许存在该场景)

    当前方法以非事务的形式运行。

    调用者抛出异常后,调用者已执行的SQL不回滚。

    当前方法已执行的SQL不回滚。

    PROPAGATION_REQUIRES_NEW

    当前方法自己新开启一个事务运行。

    调用者抛出异常后,调用者的事务回滚。

    当前方法的事务不回滚。

    当前方法自己新开启一个事务运行。

    调用者抛出异常后,调用者已执行的SQL不回滚。

    当前方法的事务不回滚。

    PROPAGATION_NOT_SUPPORTED

    当前方法以非事务的形式运行。

    调用者抛出异常后,调用者的事务回滚。

    当前方法已执行的SQL不回滚。

    当前方法以非事务的形式运行。

    调用者抛出异常后,调用者已执行的SQL不回滚。

    当前方法已执行的SQL不回滚。

    3. 当前方法发生异常,调用者捕获当前方法的业务异常,怎么回滚?

    事务传播行为类型

    调用者是否存在事务

    结果

    PROPAGATION_REQUIRED

    当前方法加入调用者的事务。

    调用者提交事务时,抛出Spring异常。

    (不允许存在该场景)

    当前方法和调用者在同一个事务中,一起回滚。

    当前方法自己新开启一个事务运行。

    调用者以非事务的形式运行。

    当前方法的事务回滚,调用者正常运行。

    PROPAGATION_SUPPORTS

    当前方法加入调用者的事务。

    调用者提交事务时,抛出Spring异常。

    (不允许存在该场景)

    当前方法和调用者在同一个事务中,一起回滚。

    当前方法以非事务的形式运行。

    调用者以非事务的形式运行。

    当前方法的已运行的SQL不回滚,调用者正常运行。

    PROPAGATION_MANDATORY

    当前方法加入调用者的事务。

    调用者提交事务时,抛出Spring异常。

    (不允许存在该场景)

    当前方法和调用者在同一个事务中,一起回滚。

    调用者调用当前方法时,抛出Spring异常。

    (不允许存在该场景)

    调用者已运行的SQL不回滚。

    PROPAGATION_NESTED

    当前方法以“嵌套事务”的形式加入到调用者事务中运行。

    当前方法的“嵌套事务”回滚。

    调用者的事务不回滚,正常运行。

    当前方法自己新开启一个事务运行。

    调用者以非事务的形式运行。

    当前方法的事务回滚,调用者正常运行。

    PROPAGATION_NEVER

    调用者调用当前方法时,抛出Spring异常。

    (不允许存在该场景)

    调用者事务回滚。

    当前方法以非事务的形式运行。

    调用者以非事务的形式运行。

    当前方法的已运行的SQL不回滚,调用者正常运行。

    PROPAGATION_REQUIRES_NEW

    当前方法自己新开启一个事务运行。

    调用者以事务的形式运行。

    当前方法抛出异常,当前方法事务回滚。

    调用者方法正常运行。

    当前方法自己新开启一个事务运行。

    调用者以非事务的形式运行。

    当前方法抛出异常,当前方法事务回滚。

    调用者方法正常运行。

    PROPAGATION_NOT_SUPPORTED

    当前方法以非事务的形式运行。

    调用者的事务在当前方法执行期间会被挂起,当前方法执行结束后恢复。

    当前方法抛出异常,当前方法已执行的SQL不回滚。

    调用者正常运行。

    当前方法以非事务的形式运行。

    调用者以非事务的形式运行。

    当前方法抛出异常,当前方法已执行的SQL不回滚。

    调用者正常运行。

    4. 当前方法发生异常,调用者不捕获当前方法的异常,怎么回滚?

    事务传播行为类型

    调用者是否存在事务

    结果

    PROPAGATION_REQUIRED

    当前方法加入调用者的事务。

    调用者抛出当前方法的异常。

    当前方法和调用者在同一个事务中,一起回滚。

    当前方法自己新开启一个事务运行。

    调用者以非事务的形式运行。

    当前方法的事务回滚。

    调用者抛出当前方法的异常,已执行的SQL不回滚。

    PROPAGATION_SUPPORTS

    当前方法加入调用者的事务。

    调用者抛出当前方法的异常。

    当前方法和调用者在同一个事务中,一起回滚。

    当前方法以非事务的形式运行。

    调用者以非事务的形式运行。

    当前方法的已运行的SQL不回滚,

    调用者抛出当前方法的异常,已运行的SQL不回滚。

    PROPAGATION_MANDATORY

    当前方法加入调用者的事务。

    调用者抛出当前方法的异常,

    当前方法和调用者在同一个事务中,一起回滚。

    调用者调用当前方法时,抛出Spring异常。

    (不允许存在该场景)

    调用者抛出Spring的异常,已运行的SQL不回滚。

    PROPAGATION_NESTED

    当前方法以“嵌套事务”的形式加入到调用者事务中运行。

    调用者抛出当前方法的异常,

    当前方法的“嵌套事务”回滚。

    调用者的事务回滚。

    当前方法自己新开启一个事务运行。

    调用者以非事务的形式运行。

    当前方法的事务回滚。

    调用者抛出当前方法的异常,已运行的SQL不回滚。

    PROPAGATION_NEVER

    调用者调用当前方法时,抛出Spring异常。

    (不允许存在该场景)

    调用者抛出Spring的异常,事务回滚。

    当前方法以非事务的形式运行。

    调用者以非事务的形式运行。

    当前方法抛出异常,已运行的SQL不回滚。

    调用者抛出异常,已运行的SQL不回滚。

    PROPAGATION_REQUIRES_NEW

    当前方法自己新开启一个事务运行。

    调用者以事务的形式运行。

    当前方法抛出异常,当前方法事务回滚。

    调用者方法抛出异常,调用者事务回滚。

    当前方法自己新开启一个事务运行。

    调用者以非事务的形式运行。

    当前方法抛出异常,当前方法事务回滚。

    调用者方法抛出异常,调用者已执行的SQL不回滚。

    PROPAGATION_NOT_SUPPORTED

    当前方法以非事务的形式运行。

    调用者在当前方法执行期间,事务会被挂起。

    当前方法抛出异常,当前方法已执行的SQL不回滚。

    调用者抛出异常,调用者事务回滚。

    当前方法以非事务的形式运行。

    调用者以非事务的形式运行。

    当前方法抛出异常,当前方法已执行的SQL不回滚。

    调用者抛出异常,调用者已执行的SQL不回滚。


    总结

    以上就是今天要讲的内容,本文仅仅简单介绍了Spring事务传播行为,而工作中的业务往往非常复杂,需要大家更加认真。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    使用docker安装logstash的具体方法
    2022-8-25 第七小组 学习日记 (day49)网上点餐系统
    聚合大模型场景助力产业升级,WAIC 2024 容联云论坛即将开幕
    Ubuntu--解决系统时间不正确的问题
    在ubuntu系统中设置virtualbox虚拟机开机自动启动
    牛客多校2 - Link with Level Editor I(DP优化)
    非饱和激活函数ReLu为什么比饱和激活函数sigmoid、tanh好
    springboot银行客户管理系统毕业设计源码250903
    OpenFaaS梳理之一:部署
    C++ 游戏飞机大战, 字符型的
  • 原文地址:https://blog.csdn.net/egegerhn/article/details/126114176