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

 更新时间:2017年09月30日 11:21:24   作者:OkidoGreen  
这篇文章主要介绍了Spring配置中transactionAttributes的使用方法介绍的相关内容,具有一定参考价值,需要的朋友可以了解下。

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

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

<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
lazy-init="true" abstract="true"> 
<property name="transactionManager"> 
<ref bean="transactionManager" /> 
</property> 
<property name="transactionAttributes"> 
<props> 
<prop key="sav*">PROPAGATION_REQUIRED</prop> 
<prop key="update*">PROPAGATION_REQUIRED</prop> 
<prop key="delete*">PROPAGATION_REQUIRED</prop> 
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> 
<prop key="find*">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, 设置操作权限为只读,一般用于查询的方法,优化作用.

总结

以上就是本文关于Spring配置中transactionAttributes的使用方法介绍的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:浅谈Springboot之于Spring的优势 、  Spring事务传播属性和隔离级别详细介绍  、 浅谈Spring Boot 微服务项目的推荐部署方式等。感谢大家对本站的支持。

相关文章

  • Java emoji持久化mysql过程详解

    Java emoji持久化mysql过程详解

    这篇文章主要介绍了Java emoji持久化mysql过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Java8中如何通过方法引用获取属性名详解

    Java8中如何通过方法引用获取属性名详解

    这篇文章主要给大家介绍了关于Java8中如何通过方法引用获取属性名的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java 文件上传(单文件与多文件)

    java 文件上传(单文件与多文件)

    这篇文章主要介绍了java 文件上传(单文件与多文件)的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • Springboot访问html页面的教程详解

    Springboot访问html页面的教程详解

    这篇文章主要介绍了Springboot访问html页面的教程,本文图文并茂给大家介绍的非常详细,需要的朋友可以参考下
    2018-03-03
  • 详解Java 中的三种代理模式

    详解Java 中的三种代理模式

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;这篇文章主要介绍了Java 中的三种代理模式,需要的朋友可以参考下
    2018-08-08
  • Java深入了解数据结构中常见的排序算法

    Java深入了解数据结构中常见的排序算法

    这篇文章主要介绍了Java常用的排序算法及代码实现,在Java开发中,对排序的应用需要熟练的掌握,这样才能够确保Java学习时候能够有扎实的基础能力。那Java有哪些排序算法呢?本文小编就来详细说说Java常见的排序算法,需要的朋友可以参考一下
    2022-01-01
  • 解决SpringBoot2.1.0+RocketMQ版本冲突问题

    解决SpringBoot2.1.0+RocketMQ版本冲突问题

    这篇文章主要介绍了解决SpringBoot2.1.0+RocketMQ版本冲突问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Java8中常见函数式接口的使用示例详解

    Java8中常见函数式接口的使用示例详解

    在 Java 8 中,函数式接口是一个关键的特性,它们允许将方法作为参数传递或返回类型,本文为大家整理了一些常见的函数式接口的使用,希望对大家有所帮助
    2023-12-12
  • java基础之反射和泛型以及注解

    java基础之反射和泛型以及注解

    这篇文章主要介绍了 java基础之反射和泛型以及注解的相关资料,需要的朋友可以参考下
    2017-07-07
  • 详解用Spring Boot零配置快速创建web项目

    详解用Spring Boot零配置快速创建web项目

    本篇文章主要介绍了详解用Spring Boot零配置快速创建web项目,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03

最新评论