前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java之Spring配置中transactionAttributes的详解

Java之Spring配置中transactionAttributes的详解

原创
作者头像
IT工作者
发布2022-03-29 10:32:32
3970
发布2022-03-29 10:32:32
举报
文章被收录于专栏:程序技术知识

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

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

代码语言:javascript
复制
<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, 设置操作权限为只读,一般用于查询的方法,优化作用.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档