结合http://www.iteye.com/topic/35907,简单总结一下自己的理解:
(上图AD和BC代表两个事务,1,2,3代表事务执行的三个阶段。图简陋了点,有点像“金箍棒”)
使用嵌套事务的场景有两点需求:
- 需要事务BC与事务AD一起commit,即:作为事务AD的子事务,事务BC只有在事务AD成功commit时(阶段3成功)才commit。这个需求简单称之为“联合成功”。这一点PROPAGATION_REQUIRED可以做到。
- 需要事务BC的rollback不(无条件的)影响事务AD的commit。这个需求简单称之为“隔离失败”。这一点PROPAGATION_REQUIRES_NEW可以做到。
使用PROPAGATION_REQUIRED满足需求1,但子事务BC的rollback会无条件地使父事务AD也rollback,不能满足需求2。
使用PROPAGATION_REQUIRES_NEW满足需求2,但子事务(这时不应该称之为子事务)BC是完全新的事务上下文,父事务(这时也不应该称之为父事务)AD的成功与否完全不影响BC的提交,不能满足需求1。
同时满足上述两条需求就要用到PROPAGATION_NESTED了。PROPAGATION_NESTED在事务AD执行到B点时,设置了savePoint(关键)。
当BC事务成功commit时,PROPAGATION_NESTED的行为与PROPAGATION_REQUIRED一样。只有当事务AD在D点成功commit时,事务BC才真正commit,如果阶段3执行异常,导致事务AD rollback,事务BC也将一起rollback ,从而满足了“联合成功”。
当阶段2执行异常,导致BC事务rollback时,因为设置了savePoint,AD事务可以选择与BC一起rollback或继续阶段3的执行并保留阶段1的执行结果,从而满足了“隔离失败”。
当然,要明确一点,事务传播策略的定义是在声明或事务管理范围内的(首先是在EJB CMT规范中定义,Spring事务框架补充了PROPAGATION_NESTED),编程式的事务管理不存在事务传播的问题。
另外,SavePoint在JDBC3.0中,所以应用嵌套事务必须保证JDK1.4+和驱动对JDBC3.0的支持。
强调,补充一点:PROPAGATION_NESTED只是Spring针对JDBC3.0以上版本SavePoint机制的一个事务传播机制的扩展,J2EE体系中是没有的,所以如果应用中使用JTA作为底层的事务管理机制的话,使用Spring也是不可能支持PROPAGATION_NESTED。不过JPA的体系中好像是有SavePoint的机制(还没有细研究过),Spring应该可以在之上做相应的支持。这点有待进一步研究!
- 大小: 4.5 KB
分享到:
相关推荐
当你在方法上使用`@Transactional(propagation = Propagation.NESTED)`时,Spring会在现有事务(如果有)中启动一个新的子事务。 2. **Savepoint**:在子事务开始时,Spring会自动创建一个保存点。如果子事务内部...
Spring事务的传播行为是Spring框架在事务管理中的一项重要特性,它定义了在不同事务上下文中如何执行方法的规则。这些行为由`TransactionDefinition`接口中的7种常量表示,它们分别为: 1. `PROPAGATION_REQUIRED`:...
7. **PROPAGATION_NESTED**:如果当前存在事务,那么方法将在一个嵌套的事务中执行,这个事务是一个依赖于外部事务的子事务,如果外部事务回滚,子事务也会回滚,反之亦然。如果当前没有事务,它的行为类似于...
### Spring中事务的传播属性详解 #### 一、引言 在使用Spring框架进行应用程序开发时,事务管理是一项非常重要的特性。Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。其中,声明式事务管理因其...
Spring 事务管理是Java开发中一个至关重要的概念,特别是在企业级应用中,它确保了数据的一致性和完整性。Spring 提供了一种灵活的方式来管理和控制事务的边界,这主要体现在TransactionDefinition接口定义的7种事务...
在深入理解Spring事务传播属性之前,我们首先需要了解Spring中的事务管理模型,包括编程式事务管理和声明式事务管理。 编程式事务管理通过TransactionTemplate或PlatformTransactionManager接口手动控制事务的开始...
你可以创建一个简单的 Spring 应用,配置事务管理器,并在业务层使用 @Transactional 注解或 TransactionTemplate 进行事务控制,以加深理解和应用。 总的来说,Spring 的事务管理机制提供了强大而灵活的支持,无论...
Spring事务原理是指Spring框架中的一种机制,用于管理事务,并提供了多种配置方式。事务是指一系列的操作,作为一个整体执行,如果其中某个操作失败,整个事务将回滚。Spring事务原理围绕着两个核心:...
在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理事务。本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将...
- PROPAGATION_NESTED:如果已有事务,就在当前事务中创建一个嵌套事务;没有则新建一个。 在实际开发中,例如在删除客户和订单的场景下,可以使用PROPAGATION_REQUIRES_NEW,确保订单删除失败时,不会影响客户...
Spring定义了七种事务传播行为:PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER和PROPAGATION_NESTED。每种行为都...
总结来说,"Spring事务传播Demo"是一个用于学习和演示Spring事务管理和传播行为的实例,通过分析和实践这个Demo,开发者可以更好地理解和掌握Spring在处理事务时的复杂情况,提升在实际项目中的应用能力。...
7. **PROPAGATION_NESTED**:如果当前存在活动事务,则在嵌套事务中运行;如果没有活动事务,则按`PROPAGATION_REQUIRED`执行。这种传播行为仅对`DataSourceTransactionManager`有效。 #### 三、数据库隔离级别 ...
常见的事务类型有 PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORT、PROPAGATION_NEVER、PROPAGATION_NESTED 等。 五、Spring 编程式事务...
在Java企业级开发中,Spring和Hibernate是两个非常重要的框架,Spring主要负责依赖注入和管理事务,而Hibernate则是一个强大的对象关系映射(ORM)工具,用于处理数据库操作。本篇将深入探讨Spring与Hibernate结合时...
Spring 事务传播是Spring框架中事务管理的重要特性,它定义了在不同事务边界之间如何处理事务的方法调用。Spring 在 `TransactionDefinition` 接口中定义了七种事务传播行为,每种行为都针对不同的业务场景提供了...
Spring事务管理支持四种传播行为(PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW, PROPAGATION_SUPPORTS, PROPAGATION_NOT_SUPPORTED, PROPAGATION_NEVER, PROPAGATION_MANDATORY, PROPAGATION_NESTED),这些...
为了更好地理解上述事务传播行为的配置方式,以下是一个简单的示例配置: ```xml <!-- Hibernate事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3....