Spring配置中transactionAttributes的意义

简介:   最近使用JSF+Spring+OpenJPA框架开发,但是在使用spring提供的JpaTemplate进行查询时,如果数据量超过100条,查询效率就会明显降低。


 

最近使用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()的方法中,如果方法内部使用更新、查询、再更新的操作流程,会不会造成调用查询时,由于上述配置造成的抛出异常。

另外,如果出现









prop key="myMethod"



PROPAGATION_REQUIRED,readOnly,-Exception







/prop



这样的配置,其中:

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

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

目录
相关文章
|
14天前
|
SQL Java 数据库连接
(自用)Spring常用配置
(自用)Spring常用配置
16 0
|
2月前
|
缓存 Java Maven
Spring Boot自动配置原理
Spring Boot自动配置原理
48 0
|
2月前
|
Java Spring
[Spring]aop的配置与使用
[Spring]aop的配置与使用
40 0
[Spring]aop的配置与使用
|
2月前
|
安全 Java Maven
后端进阶之路——深入理解Spring Security配置(二)
后端进阶之路——深入理解Spring Security配置(二)
|
1月前
|
SQL Java 数据库连接
挺详细的spring+springmvc+mybatis配置整合|含源代码
挺详细的spring+springmvc+mybatis配置整合|含源代码
42 1
|
6天前
|
存储 安全 Java
第2章 Spring Security 的环境设置与基础配置(2024 最新版)(下)
第2章 Spring Security 的环境设置与基础配置(2024 最新版)(下)
16 0
|
6天前
|
安全 Java 数据库
第2章 Spring Security 的环境设置与基础配置(2024 最新版)(上)
第2章 Spring Security 的环境设置与基础配置(2024 最新版)
29 0
|
8天前
|
安全 Java Spring
Spring Security 5.7 最新配置细节(直接就能用),WebSecurityConfigurerAdapter 已废弃
Spring Security 5.7 最新配置细节(直接就能用),WebSecurityConfigurerAdapter 已废弃
19 0
|
8天前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
24 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
|
13天前
|
JSON Java 数据库连接
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
23 1