[转]Spring----Spring的事务传播级别和事务性能优化
出自:
http://www.blogjava.net/pengpenglin/archive/2010/03/15/315445.html
【一】事务传播的级别:按照对事务要求的程度,从低--->高可以分成下面7个级别
PROPAGATION_NEVER
总是非事务地执行,如果存在一个活动事务,则抛出异常
PROPAGATION_NOT_SUPPORTED
总是非事务地执行,并挂起任何存在的事务。
PROPAGATION_SUPPORTS
如果没有事务,则非事务的执行。如果存在一个事务,则加入当前事务。
PROPAGATION_REQUIRED
如果没有事务,则开启一个新的事务。如果存在一个事务,则加入当前事务。
PROPAGATION_NESTED
如果没有活动事务, 则按PROPAGATION_REQUIRED 属性执行,如果一个活动的事务存在,则运行在一个嵌套的事务中.
PROPAGATION_REQUIRES_NEW
总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
PROPAGATION_MANDATORY
如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
【二】PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别:
PROPAGATION_REQUIRES_NEW每次开启一个新的事务,同时挂起前一个正在运行的事务,开启的新事务会独立提交/回滚。之后被挂起的前一个事务继续运行,在结束时提交或回滚。
由此看来,当使用PROPAGATION_REQUIRES_NEW时,服务层的内部其实是由多个独立的小事务组成的一个大的事务。每个小事务彼此独立,互不影响。一旦内层事务进行了提交,外层事务不能对其进行回滚。而且它需要JTA事务管理器的支持。
PROPAGATION_NESTED并不开启新的事务,它使用save point来代替事务,它可以选择在自己的逻辑内回滚,但它不能在自己的逻辑内提交,而必须等到外层的逻辑提交时一并提交。
由此看来,当使用PROPAGATION_NESTED时,服务层的内部只有一个事务存在,内嵌的事务回滚不会引起外层的事务回滚(如同上面说的,它可以在自己的逻辑内回滚),但外层的事务回滚会引起内嵌的事务回滚(因为内嵌的事务必须等到外层事务提交时才一并提交)。需要JDBC 3.0以上驱动及1.4以上的JDK版本支持。
【三】PROPAGATION_XXX的设置和性能优化
一般来说,PROPAGATION_REQUIRED的传播级别就已经够了。对于长时间、可分段的任务,如果也采用一个大的事务一次性提交,则一旦失败代价太大了。最典型的例子就是:大批量的数据导入,你总不能因为一条数据错了而将其它插入全部回滚吧!
这时可以考虑划分为小段的PROPAGATION_REQUIRED事务进行,多次独立提交事务。
也考虑考虑设置为PROPAGATION_NESTED,因为JDBC 3.0提供了save point机制,可以在事务未提交的情况下保存事务中间的状态,一旦回滚不会回滚全部,而是只回滚到save point点(根据时间)。那么我们可以把大的事务划分成多个小的内嵌事务,每个内嵌事务执行成功后刷新save point,如果全部成功则一次性提交,如果中间失败了则回滚则上一个save point,同时继续下一个内嵌事务,不怕将前面尚未提交的其它事务操作全部回滚。
和PROPAGATION_REQUIRED相比,好处就是事务提交的次数少了,可以一次性写入
分享到:
相关推荐
2. **spring-context-3.2.0.RELEASE.jar**:上下文模块扩展了`spring-core`,引入了ApplicationContext接口,提供了一种管理和配置bean、事件传播、国际化和资源访问的环境。它还支持AOP(面向切面编程)和JMX(Java...
2. **spring-context**:扩展了spring-beans,引入了ApplicationContext接口,提供了一种更高级的容器,可以处理国际化、事件传播、资源加载等功能。 3. **spring-aop**:提供了AOP功能,包括定义切入点、通知、...
- **性能优化**:通过批处理和连接池,Spring JDBC能有效地提高数据库操作的性能。 在项目中使用"spring-jdbc jar包",开发者需要配置DataSource,并根据需求选择使用JdbcTemplate或其他辅助类。在编写SQL时,可以...
5.2.8.RELEASE是Spring框架的一个稳定版本,提供了诸多改进和新特性,旨在提升性能、增强安全性和改善开发者体验。本文将对这个版本的源码进行深入剖析,帮助读者更好地理解和利用Spring框架。 首先,源码分析通常...
Spring Framework 是一个开源的Java平台,它为构建企业级应用提供了全面的编程和配置模型。这个框架的核心特性是依赖注入(Dependency Injection,DI),用于管理对象的生命周期和配置。Spring 框架的设计目的是使...
3. `spring-context.jar`:构建于`spring-core`和`spring-beans`之上,提供应用程序上下文,支持AOP(Aspect-Oriented Programming)和事件传播。 4. `spring-aop.jar`:实现了面向切面编程,允许在不修改代码的情况...
### Spring事务的传播特性和事务隔离级别 #### 一、Spring事务的传播特性(Propagation) 在Spring框架中,事务管理不仅提供了ACID属性的支持,还引入了事务的传播特性,这些特性决定了当一个方法调用另一个方法时,...
1. `spring-context`模块:这是Spring的核心,提供了上下文抽象,支持bean的生命周期管理和事件传播,以及AOP和国际化功能。 2. `spring-core`模块:包含了核心工具类,提供基本的反射和类型转换支持,是其他模块的...
1. **性能优化**:3.2.5 版本对核心容器进行了性能优化,提高了初始化速度和内存利用率,使得应用启动更快,运行更轻量。 2. **新特性**:引入了对 Java 7 的全面支持,包括新的类型推断和多线程 API 的改进,增强...
在4.3.21.RELEASE版本中,Spring框架继续保持着稳定性和性能优化。 首先,我们看到的"spring-context-4.3.21.RELEASE-javadoc.jar"和"spring-context-4.3.21.RELEASE-sources.jar"是关于Spring上下文模块的文档和源...
`@Transactional`注解用于标记需要进行事务管理的方法,其包含多个属性,如`propagation`定义事务传播行为,`isolation`定义事务隔离级别,`rollbackFor`指定触发回滚的异常类型等。 `jdbcTemplate`的使用通常涉及...
3. **spring-context.jar**:扩展了spring-core和spring-beans,引入了 ApplicationContext,它是Spring的上下文容器,可以管理Bean并提供国际化、事件传播、AOP等功能。 4. **spring-aop.jar**:实现了面向切面...
在5.3.29版本中,响应式编程的稳定性和性能都得到了优化。 五、集成与扩展 Spring 5.3.29加强了与其他流行框架的集成,例如Spring Boot、Spring Cloud等,为开发者提供了开箱即用的功能。同时,通过SPI(Service ...
### Spring 事务传播特性和事务隔离级别详解 #### 一、Spring 事务传播特性 在进行多层服务架构设计时,事务的管理尤其重要。为了确保数据的一致性,Spring 提供了一种灵活的方式来控制事务的传播行为。下面详细...
5.3.3版本是Spring框架的一个稳定版本,它带来了许多新特性、优化和改进,使得开发者能够更高效地构建高质量的Java应用程序。本文将对Spring Framework 5.3.3的官方源码进行深入探讨,揭示其背后的原理和设计思想。 ...
2. **AOP**:通过定义切面和通知,可以实现跨越多个对象的功能,如事务管理、性能监控。 3. **模块化设计**:Spring框架由多个可选模块组成,可以根据项目需求选择合适的模块,避免引入不必要的复杂性。 4. **MVC...
Spring框架是Java开发中不可或缺的重要组件,其最新版本5.3.11.RELEASE提供了许多增强的功能和优化,旨在提高开发效率和应用性能。本文将深入探讨Spring框架5.3.11.RELEASE的主要特点、核心组件以及更新内容。 1. *...
Spring 4.1.2是一个稳定版本,它对之前版本的API进行了优化和改进,同时保持了与其他版本的兼容性。这使得开发者可以在不破坏现有系统的情况下升级到新版本。 9. **其他特性** - **JSR-330标准支持**:Spring 4.x...
Spring 框架提供了一套完善的事务管理机制,其中包含了多种事务传播属性和事务隔离级别。这些特性使得在处理数据库操作时,能够更好地控制事务的边界和行为,从而确保数据的一致性和完整性。 首先,我们来看一下...
以上配置表明,所有在com.example.service包及其子包下的方法都将被包含在默认的REQUIRED事务传播规则中。 总的来说,Spring JDBC为Java开发者提供了一种简洁、高效的方式来处理数据库操作,结合MySQL8和Java 8,...