<xsd:attribute name="propagation" default="REQUIRED">
<xsd:annotation>
<xsd:documentation source="java:org.springframework.transaction.annotation.Propagation"><![CDATA[
The transaction propagation behavior.
]]></xsd:documentation>
</xsd:annotation>
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="REQUIRED"/>
<xsd:enumeration value="SUPPORTS"/>
<xsd:enumeration value="MANDATORY"/>
<xsd:enumeration value="REQUIRES_NEW"/>
<xsd:enumeration value="NOT_SUPPORTED"/>
<xsd:enumeration value="NEVER"/>
<xsd:enumeration value="NESTED"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
PROPAGATION_REQUIRED(默认):如果当前存在事务,则加入该事务;如果不存在事务,则创建一个新的事务。
PROPAGATION_REQUIRES_NEW:总是创建一个新的事务,不管当前是否存在事务。当前事务如果存在,则被挂起。
PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果不存在,则以非事务方式执行。
PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出一个illegalTransationStateException.
PROPAGATION_NEVER: 如果当前事务存在,则抛出一个IllegalTransactionStateException;如果当前不存在事务,则以非事务方式执行。
PROPAGATION_NOT_SPRING_TRANSACTION:当前事务不管存在与否,都以非事务方式执行。如果在Spring管理的Bean中调用了一个采用此传播行为的方法,那么当前的spring事务将被挂起。
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前不存在事务,则创建一个新事务。嵌套事务具有自己的回滚边界。
通过合理配置这些传播行为,可以控制方法之间事务的交互方式,从而满足不同的业务需求。
举例说明
以下是一些关于 Spring 事务传播机制的示例:
1. **PROPAGATION_REQUIRED**
假设有两个方法 A 和 B,A 被标记为 `@Transactional(propagation = Propagation.REQUIRED)`,B 被标记为 `@Transactional`(默认使用 PROPAGATION_REQUIRED)。
当从一个非事务方法调用 A,A 会创建一个新的事务。然后在 A 内部调用 B,因为 B 也需要事务,并且当前已经存在事务,所以 B 会加入 A 的事务中。
2. **PROPAGATION_REQUIRES_NEW**
假设我们有两个方法 C 和 D,C 被标记为 `@Transactional(propagation = Propagation.REQUIRES_NEW)`,D 被标记为 `@Transactional(propagation = Propagation.REQUIRED)`。
当从一个非事务方法调用 C,C 会创建一个新的独立事务。然后在 C 内部调用 D,尽管 D 通常会加入当前事务,但因为 C 创建了一个新的事务,所以 D 会在这个新的独立事务中执行。这意味着 C 和 D 的事务是完全独立的。
3. **PROPAGATION_NESTED**
假设有两个方法 E 和 F,E 被标记为 `@Transactional(propagation = Propagation.NESTED)`,F 被标记为 `@Transactional(propagation = Propagation.REQUIRED)`。
当从一个非事务方法调用 E,E 会创建一个嵌套事务,这意味着它仍然在当前事务的上下文中,但拥有自己的回滚边界。然后在 E 内部调用 F,F 会加入 E 的嵌套事务中。如果在 F 或 E 的嵌套事务中发生异常,只有嵌套事务会回滚,不会影响外部的主事务。
这些示例展示了如何通过不同的事务传播行为来控制方法之间的事务交互。在实际开发中,你可以根据业务需求选择合适的传播行为来确保数据的一致性和完整性。