当前位置: 首页 > 知识库问答 >
问题:

Spring事务在类到类级别和方法到方法级别的传播

鱼宜
2023-03-14

Spring Transaction Propagation如何为Propagation_REQUIRED和Propagation_REQUIRED_NEW工作?

请提供有关类到类级别和方法到方法级别的传播的信息。

我还需要知道如何初始化/启动这些事务,并在当前事务完成时恢复以前的事务,以进行传播。

在需要传播和需要新传播的情况下使用单个事务时,事务将如何决定何时需要提交/回滚?

共有1个答案

黄沈浪
2023-03-14

希望这些信息可以帮助理解Springtx传播的一些基本功能和流程

这是一些关于传播的基本信息,你也可以从一些众所周知的资源中找到,但需要先放在这里,以获得一些关于Spring传播的基本想法:

传播是指决定如何在逻辑或物理事务中封装业务方法的能力。

REQUIRED行为意味着如果当前bean方法执行上下文中存在已打开的事务,则将使用相同的事务,如果已经不存在,则会创建一个新事务。

REQUIRES\u NEW behavior意味着容器将始终创建新的物理事务。

嵌套行为使嵌套的Spring事务使用相同的物理事务,但在嵌套调用之间设置保存点,因此内部事务也可以独立于外部事务回滚。

强制性行为规定,现有的已打开交易必须已经存在。否则,容器将引发异常。

NEVER行为表示,现有的已打开交易一定不存在。如果事务存在,则容器将引发异常。

NOT_SUPPORTED行为将在任何事务的范围之外执行。如果已打开的事务已经存在,它将被暂停。

如果已打开的事务已经存在,则SUPPORTS行为将在事务范围内执行。如果没有已打开的事务,则该方法将以非事务方式执行。

====================================

有些人还怀疑,如果我们提供Tx传播(例如REQUIRES_NEW),从同一类中的一个方法调用不同的方法会发生什么:

当方法调用在同一个类中从一个方法到另一个方法时,它不会创建新事务。它将使用相同的事务。这种传播仅适用于来自不同类的方法调用。

例子:

<bean id="class2" parent="yourSpringAOPInterceptor">
    <property name="target">
        <bean   class="Class2">
            <property name="prop1" ref="prop1" />
        </bean>
    </property>
    <property name="transactionAttributes">
        <props>
            <prop key="*">PROPAGATION_REQUIRED</prop>
            <prop key="methodABC">PROPAGATION_REQUIRES_NEW</prop>
        </props>
    </property>
</bean>

类2具有以下方法结构:

>

  • 方法PQR()
  • 方法ABC()

    1)当任何来自类2外部的调用来到方法PQR()时,则此方法使用外部调用者的相同事务。

    2) 当从类2外部调用methodABC()时,该方法会创建新的事务,并且不会使用外部调用方的相同事务。

    3) 当methodPQR()调用同一类的methodABC()时,methodABC()不会创建新事务,而是使用methodPQR()的相同事务。

    更多信息请参考:http://docs.spring.io/autorepo/docs/spring/4.2.x/spring-framework-reference/html/transaction.html

    ======================================

    下面的图片将帮助您理解这些事情:

    >

    当所有方法使用相同的事务时,如何提交更改。最内部的方法会提交所有更改还是最外部的方法?

    如果第二个事务出现任何异常,会发生什么?它应该只回滚第二个事务还是同时回滚第一个和第二个事务?同样,如果第一个事务得到任何异常,它将只回滚第一个事务,或者也回滚第二个(新的内部)事务提交的更改Spring是如何决定的?

    当第二个事务完成时,第一个事务如何恢复?

    感谢您的阅读。如果您发现任何错误或更多信息,请发表评论。

  •  类似资料:
    • 当我运行应用程序并点击http://localhost:8080/hello时,一切都很好: 但是,如果我删除了方法上的注释: 然后参数变为null,aspect方法抛出NullPointerException。 这似乎起作用了,但这是一个好的解决办法吗? 编辑:此解决方案也不起作用。如果我在类和方法级别上都有注释,假设类级别的注释值为false,而方法级别为true,那么注释值将为false。

    • 我是Spring/圣杯交易的新手,阅读后我仍然不清楚,所以我在这里发布, 我有一个服务类,它被注释为@Transactional我有方法,其中一些被注释为 其中一些不是。 > < li >假设,我有来自类级别的事务t1和来自doSomething()- REQUIRES_NEW的事务t2。 < li >将在t1 - findJob()和doTask()中执行的方法 < li> 将在t2中执行的方法

    • 我们在hello-world-test的基础上,我们新建了一个名为method-security的 Gradle 项目。 本项目用于演示方法级别的安全设置。 build.gradle 修改 build.gradle 文件,让我们的method-security项目成为一个新的项目。 修改内容也比较简单,修改项目名称及版本即可。 jar { baseName = 'method-securi

    • 问题内容: 我知道这是一个不好的做法,但是需要完成,否则我需要切换到。有没有一种类似于JUnit 3的testSuite的方法来指定要在类中运行的测试的顺序? 问题答案: 如果你确定你 真的 想这样做:有可能是一个更好的办法,但是这是我能拿出… JUnit4有一个注释:它使您可以覆盖测试的默认Runner。 在您的情况下,您将需要创建一个特殊的子类,并重写以按照您希望它们执行的顺序返回测试。例如,

    • Dorado支持对方法级别的超时时间设置,默认使用统一的值 1. XML配置方式 <bean id="clientProxy" class="com.meituan.dorado.config.service.spring.ReferenceBean" destroy-method="destroy"> <property name="serviceInterface" value="com.

    • 本文向大家介绍静态方法和类方法区别?相关面试题,主要包含被问及静态方法和类方法区别?时的应答技巧和注意事项,需要的朋友参考一下 尽管 classmethod 和 staticmethod 非常相似,但在用法上依然有一些明显的区别。classmethod 必须有一个指向类对象的引用作为第一个参数,而 staticmethod 可以没有任何参数。 举个栗子: