现在的位置: 首页 > 综合 > 正文

Spring配置中transactionAttributes的意义

2019年05月12日 ⁄ 综合 ⁄ 共 2202字 ⁄ 字号 评论关闭

转载自:这里

目前公司使用JSF+Spring+JPA的开发框架,先不讨论此框架的优劣,说说早期应用中碰到的问题:在使用spring提供的JpaTemplate进行查询时,如果数据量超过100条,查询效率就会明显降低。由于开始时使用JPA内部的双向关联,造成各实体内部关联过多,从而影响所有的操作,因此怀疑是因为JPA的关联关系所致。但是去掉关联关系后的效果不显著。

此时追踪JPA生成的SQL语句,发现每一个查询执行时,都会有对应的更新操作,此时推测可能是由于某处配置有问题。

不经意中发现Spring中关于事务的“transactionAttributes”配置有些费解

  1. <bean id=“baseTxProxy” lazy-init=“true”class=“org.springframework.transaction.interceptor.TransactionProxyFactoryBean” scope=“singleton” abstract=“true”>  
  2.   <property name=“transactionManager”>  
  3.    <ref local=“transactionManager” />  
  4.   </property>  
  5.   <property name=“transactionAttributes”>  
  6.    <props>  
  7.     <prop key=“register*”>PROPAGATION_REQUIRED</prop>  
  8.     <prop key=“trade*”>PROPAGATION_REQUIRED</prop>  
  9.     <prop key=“cancel*”>PROPAGATION_REQUIRED</prop>  
  10.     <prop key=“save*”>PROPAGATION_REQUIRED</prop>  
  11.     <prop key=“exe*”>PROPAGATION_REQUIRED</prop>  
  12.     <prop key=“add*”>PROPAGATION_REQUIRED</prop>  
  13.     <prop key=“persist*”>PROPAGATION_REQUIRED</prop>  
  14.     <prop key=“remove*”>PROPAGATION_REQUIRED</prop>  
  15.     <prop key=“del*”>PROPAGATION_REQUIRED</prop>  
  16.     <prop key=“update*”>PROPAGATION_REQUIRED</prop>  
  17.     <prop key=“gen*”>PROPAGATION_REQUIRED</prop>  
  18.     <prop key=“finish*”>PROPAGATION_REQUIRED</prop>  
  19.     <prop key=“get*”>PROPAGATION_REQUIRED,readOnly</prop>  
  20.     <prop key=“find*”>PROPAGATION_REQUIRED,readOnly</prop>  
  21.     <prop key=“query*”>PROPAGATION_REQUIRED,readOnly</prop>  
  22.     <prop key=“select*”>PROPAGATION_REQUIRED,readOnly</prop>  
  23.     <prop key=“is*”>PROPAGATION_REQUIRED,readOnly</prop>  
  24.    </props>  
  25.   </property>  
  26. </bean>  

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

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

按照上述配置,所有的数据库操作,spring都会使用事务,因此有必要将查询等操作的事务类型更改,将所有查询的操作改成事务类型为“PROPAGATION_NEVER”(不使用事务),则查询效率立即提升。但是此时担心一个问题:比如在一个saveXXX()的方法中,如果方法内部使用更新、查询、再更新的操作流程,会不会造成调用查询时,由于上述配置造成的抛出异常。

 

抱歉!评论已关闭.