Spring Transaction Propagation如何为PROPAGATION_REQUIRED和PROPAGATION_REQUIRES_NEW工作?
请提供有关此课程级别和方法级别方法的传播信息。
我还需要知道如何初始化/启动这些事务,并在当前事务完成PROPAGATION_REQUIRES_NEW时恢复上一个事务。
如果在PROPAGATION_REQUIRED和PROPAGATION_REQUIRES_NEW的情况下使用单个事务,事务将如何决定何时需要提交/回滚?
答案 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具有以下方法结构:
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
======================================
以下图片将帮助您了解这些内容:
第二次交易开始时比当前运行时发生的情况 第一笔交易。
当所有方法使用相同的事务时,如何提交更改。 大多数内部方法会提交所有更改还是最外部的 方法
如果第二个交易有任何异常,会发生什么?应该是 仅回滚第二个事务或应该首先回滚和 第二次交易?同样的方式,如果第一个交易得到任何 异常,它只会回滚第一个事务或也是 第二次(新内部)交易所犯的变化? - 春天怎么样 决定这个?
第二次交易完成后第一次交易如何恢复?
感谢阅读。如果您发现任何错误或更多信息,请发表评论。