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

时间:2016-08-03 06:49:46

标签: spring transactions spring-transactions propagation

Spring Transaction Propagation如何为PROPAGATION_REQUIRED和PROPAGATION_REQUIRES_NEW工作?

请提供有关此课程级别和方法级别方法的传播信息。

我还需要知道如何初始化/启动这些事务,并在当前事务完成PROPAGATION_REQUIRES_NEW时恢复上一个事务。

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

1 个答案:

答案 0 :(得分:6)

希望这些信息有助于理解spring tx传播的一些基本功能和流程。

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

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

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

REQUIRES_NEW 行为意味着容器将始终创建新的物理交易。

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

MANDATORY 行为表明现有的已打开事务必须已存在。如果不是,容器将抛出异常。

NEVER 行为表明现有的已打开事务必须不存在。如果存在事务,则容器将抛出异常。

NOT_SUPPORTED 行为将在任何交易范围之外执行。如果已打开的交易已经存在,则会暂停。

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

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

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

没有。

当方法调用是从同一个类中的方法到方法时,它不会创建新的Transaction。它将使用相同的交易。此传播仅适用于来自不同类的方法调用。

示例:

<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>

Class2具有以下方法结构:

  • methodPQR()
  • methodABC()

    1)当来自class2之外的任何调用来自methodPQR()时 此方法使用外部调用者的相同事务。

    2)当来自class2之外的任何调用来自methodABC()时 此方法创建新事务并且不使用相同的事务 外部来电者的交易。

    3)当methodPQR()调用同一类的methodABC()然后methodABC() 不会创建新的交易并使用相同的交易 methodPQR()。

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

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

以下图片将帮助您了解这些内容:

  • 第二次交易开始时比当前运行时发生的情况 第一笔交易。

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

  • 如果第二个交易有任何异常,会发生什么?应该是 仅回滚第二个事务或应该首先回滚和 第二次交易?同样的方式,如果第一个交易得到任何 异常,它只会回滚第一个事务或也是 第二次(新内部)交易所犯的变化? - 春天怎么样 决定这个?

  • 第二次交易完成后第一次交易如何恢复?

enter image description here

  

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