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