欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

transactionAttributes各属性意义及配置

程序员文章站 2024-03-01 21:16:34
在使用spring提供的jpatemplate进行查询时,如果数据量超过100 条,查询效率就会明显降低。由于开始时使用jpa内部的双向关联,造成各实体内部关联过多,从而影...

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

配置问题。

<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类似的操作。