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

Spring Transaction Propagation on Class to Class level and Method to Method Level

Spring 事务传播如何为 PROPAGATION_REQUIRED 和 PROPAGATION_REQUIRES_NEW 工作?

请提供有关 class 到 class 级别以及方法到方法级别的此传播的信息。

我还需要知道这些交易如何 initialised/started 并在当前交易完成 PROPAGATION_REQUIRES_NEW 后恢复之前的交易。

在 PROPAGATION_REQUIRED 和 PROPAGATION_REQUIRES_NEW 的情况下使用单个事务时,事务将如何决定何时需要 commit/rollback?

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

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

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

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

REQUIRES_NEW 行为意味着新的物理事务将始终由容器创建。

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

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

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

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

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

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

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

没有。

当方法调用是在同一 class 中从一个方法调用到另一个方法时,它不会创建新的事务。它将使用相同的交易。此传播仅适用于来自不同 classes.

的方法调用

示例:

<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()
  • 方法ABC()

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

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

    3) 当 methodPQR() 调用同一个 class 的 methodABC() 然后 methodABC() 不创建新事务并使用相同的事务 方法PQR().

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

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

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

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

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

  • 如果第二笔交易出现异常怎么办?应该是 只回滚第二个事务还是应该先回滚并且 第二双方交易?同样,如果第一笔交易得到任何 异常比它只会回滚第一个事务或者 第二个(新内部)事务提交的更改? - 如何 Spring 决定这个?

  • 如何在第二个事务完成后恢复第一个事务?

Thanks for reading. Please comments if you find anything wrong or more info on this.