`

Spring配置中transactionAttributes的意义

 
阅读更多

最近使用JSF+Spring+OpenJPA框架开发,但是在使用spring提供的JpaTemplate进行查询时,如果数据量超过100 条,查询效率就会明显降低。由于开始时使用JPA内部的双向关联,造成各实体内部关联过多,从而影响所有的操作,因此怀疑是因为JPA的关联关系所致。但 是去掉关联关系后的效果不显著。

查找spring的相关配置,发现原来关于“transactionAttributes”有问题。原来的配置如下:

〈bean id=“baseTxProxy” lazy-init=“true”class=“org.springframework.transaction.interceptor.TransactionProxyFactoryBean” scope=“singleton” abstract=“true”〉
〈property name=“transactionManager”〉
〈ref local=“transactionManager” /〉
〈/property〉
〈property name=“transactionAttributes”〉
〈props〉
〈prop key=“register*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“trade*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“cancel*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“save*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“exe*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“add*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“persist*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“remove*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“del*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“update*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“gen*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“finish*”〉PROPAGATION_REQUIRED〈/prop〉
〈prop key=“get*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
〈prop key=“find*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
〈prop key=“query*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
〈prop key=“select*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
〈prop key=“is*”〉PROPAGATION_REQUIRED,readOnly〈/prop〉
〈/props〉
〈/property〉
〈/bean〉

使用上述配置,在JPA打出的日志中显示每次查询时都要进行更新操作,查阅相关spring 的资料后发现transactionAttributes的各种属性的意义如下:

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

当 前所有的事务都使用“PROPAGATION_REQUIRED”属性值,并且控制事务的操作权限为只读,以保证查询时不会更新数据。根据上述定义 “PROPAGATION_REQUIRED”属性会造成为所有的操作都创建事务,从而会出现JPA的日志中查询时也会进行更新操作的现象,也就造成了效 率的低下。将所有查询的操作改成事务类型为“PROPAGATION_NEVER”(不使用事务),则查询效率立即提升,但是此时担心一个问题:比如在一 个saveXXX()的方法中,如果方法内部使用更新、查询、再更新的操作流程,会不会造成调用查询时,由于上述配置造成的抛出异常。

另外,如果出现

这样的配置,其中:

-Exception表示有Exception抛出时,事务回滚. -代表回滚+就代表提交

readonly 就是read only, 设置操作权限为只读,一般用于查询的方法,优化作用.

分享到:
评论

相关推荐

    Spring配置中transactionAttributes的使用方法介绍

    总之,`transactionAttributes`是Spring中控制事务行为的关键元素,通过正确配置,可以有效地管理事务的生命周期,优化应用程序性能,并确保数据一致性。在实践中,应根据业务需求谨慎选择合适的事务传播行为和只读...

    Spring配置的5种方式

    在Spring中,声明式事务管理可以通过基于XML的配置或者基于注解的方式实现。 事务配置的核心组成部分包括: - **DataSource**: 数据源配置,用于连接数据库。 - **TransactionManager**: 事务管理器配置,负责事务...

    hibernate+spring配置详细解析

    本文详细介绍了Hibernate与Spring集成过程中涉及的关键配置,包括数据源、SessionFactory、事务管理器以及事务代理工厂的配置细节。通过这些配置,可以实现对数据库的高效访问,并利用Spring的事务管理机制来简化...

    spring事务配置的5中方式

    在Spring中,事务配置主要涉及到三个核心组件:DataSource、TransactionManager和代理机制。下面将详细介绍Spring的五种事务配置方式。 1. **基于XML的事务配置** - **每个Bean都有一个代理**: 在这种配置方式中...

    spring事务配置的五种方式

    本文将详细介绍Spring中事务配置的五种方式,帮助开发者更好地理解和运用这些配置方法。 #### 二、Spring事务配置的基本组成部分 Spring事务配置主要包含以下三个核心组件: 1. **DataSource**:负责提供与数据库...

    Spring 事务代理配置

    在深入探讨Spring事务代理配置之前,我们先简要回顾一下Spring...通过以上步骤,我们就可以在Spring中成功配置事务代理,使得应用程序中的业务方法能够自动进行事务管理,极大地提高了代码的可维护性和事务的一致性。

    spring的5中事物配置 介绍spring的5中事物配置

    下面将详细介绍Spring中的五种事务配置方式。 1. **基于代理的事务管理(Proxy-based Transaction Management)** - **JDK动态代理**:在没有接口的情况下,Spring会创建一个实现了目标类所有接口的代理对象,然后...

    spring声明式事务配置

    提供的XML配置示例展示了如何在Spring中配置声明式事务。具体来说,该示例包括以下几个关键组件: 1. **SessionFactory Bean**:用于配置Hibernate的SessionFactory实例,它是Hibernate的核心组件之一,负责创建...

    Spring 配置学习文件

    在Spring框架中,配置文件起着至关重要的作用,它们定义了应用程序的组件以及它们之间的依赖关系。这里有两个主要的配置文件:`applicationContext-database.xml` 和 `applicationContext-pojo.xml`,分别关注于...

    详解Spring配置事务的五种方式

    5. **Spring Boot的自动配置**:在Spring Boot项目中,通过@EnableTransactionManagement和适当的依赖,Spring Boot能自动配置DataSource和TransactionManager,并且可以通过@Transactional注解进行事务控制。...

    transactionAttributes各属性意义及配置

    transactionAttributes 各属性意义及配置 TransactionAttributes 是 Spring 框架中的一种事务管理机制,它提供了多种事务传播行为类型,以便开发者根据需要选择合适的传播行为。TransactionAttributes 的配置主要...

    spring1.2的配置-jdbc

    下面将根据提供的 XML 配置文件来详细介绍 Spring 1.2 中如何配置 JDBC 相关的内容。 #### 1. 配置文件结构解析 首先,我们需要了解提供的 XML 文件的基本结构: ```xml <!DOCTYPE beans PUBLIC "-//SPRING//DTD...

    spring框架配置bean的高级属性

    在Spring框架中配置Bean是进行依赖注入的基础操作,而深入理解如何高效地配置Bean及其属性对于提高开发效率、优化项目结构具有重要意义。本文将详细解读标题“spring框架配置bean的高级属性”以及描述中的内容,并...

    spring配置hibernate事务

    以下是如何在Spring中配置Hibernate事务的详细步骤和概念解释。 首先,理解Spring的核心特性——控制反转(IoC)和面向切面编程(AOP)。IoC使得Spring能够管理对象的生命周期和依赖关系,而AOP则用于在不修改源...

    Spring事务配置的五种方式

    在第一种配置方式中,每个业务 Bean 都有一个代理。`TransactionProxyFactoryBean` 负责创建事务代理,它通过 AOP(面向切面编程)来实现事务管理。当调用代理方法时,Spring 会自动在方法的开始和结束处插入事务...

    spring配置事物的5种方式

    在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本文将详细介绍SSH(Spring、Struts、Hibernate)框架整合时,Spring配置事务的五种方式。首先,我们要理解Spring事务配置的基本组成...

    Spring的事务配置的五种方式

    在Spring中,事务管理通常分为三部分:DataSource、TransactionManager和代理机制。DataSource是数据源,TransactionManager是事务管理器,而代理机制则是实现事务控制的关键。 1. **基于XML的AOP代理配置** 这是...

    spring声明事务的配置

    在Spring 1.x中,声明式事务有两种主要的配置方式,第一种是通过XML配置逐个为每个业务类创建事务代理。首先,你需要声明一个事务管理器,如`HibernateTransactionManager`,然后定义业务层的bean,并为其创建一个...

    spring事务配置详解

    Spring 事务配置是Spring 框架中的重要组成部分,它提供了对数据库操作事务性的管理,确保数据的一致性和完整性。Spring 提供了多种方式来配置事务管理,主要分为编程式事务管理和声明式事务管理。下面将详细介绍这...

Global site tag (gtag.js) - Google Analytics