`
kakarot_java
  • 浏览: 161912 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring 异常 事务

阅读更多
最近使用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, 设置操作权限为只读,一般用于查询的方法,优化作用.


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/alex197963/archive/2009/08/11/4433531.aspx
分享到:
评论

相关推荐

    Spring事务原理、Spring事务配置的五种方式

    Spring事务原理和配置 Spring事务原理是指Spring框架中的一种机制,用于管理事务,并提供了多种配置方式。事务是指一系列的操作,作为一个整体执行,如果其中某个操作失败,整个事务将回滚。Spring事务原理围绕着两...

    Spring事务传播机制.docx

    当我们在使用 Spring 所提供的事务功能时,如果是仅仅处理单个的事务,是比较容易把握事务的提交与回滚,不过一旦引入嵌套事务后,多个事务的回滚和提交就会变得复杂起来,各个事务之间是如何相互影响的,是一个值得...

    Spring事务传播特性解析

    自身不会开启事务,在事务范围使用抛出异常 7、Propagation.NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。需要...

    Spring框架+Spring中的事务

    什么是Spring事务传播机制 Spring事务传播机制是指在多个事务操作发生时,如何管理这些操作之间的事务关系。Spring事务传播机制可以通过Propagation枚举类中的不同值来指定,共包括七种不同的传播行为。具体来说,...

    Spring事务优缺点及使用详解.docx

    事务简介 二、程序举例环境搭建 o1. 创建数据表 ...三、使用 Spring 的事务注解管理事务 o1. 声明事务管理器 o2. 开启注解驱动 o3. 完整Spring配置文件 o4. 业务层 public 方法加入事务属性 o5. 测试

    spring五种事务配置demo

    本例所有的事务放在service层进行管理,方法中间抛出运行时异常以测试是否回滚 Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,...

    关于spring声明式事务管理异常处理的测试和小结

    spring声明式事务管理异常处理的测试

    spring编程式事务与声明式事务详解

    Spring 编程式事务与声明式事务详解 本文将详细解释 Spring 的编程式事务管理及声明式事务管理,帮助读者理清思路。 事务管理的重要性 事务管理对于企业应用至关重要。它保证了用户的每一次操作都是可靠的,即便...

    Spring事务管理只对出现运行期异常进行回滚

    Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚,需要了解更多Spring事务方面的知识,可详看本

    spring注解式事务

    "spring注解式事务" Spring框架提供了基于注解的方式来管理事务,使用@Transactional注解来标记需要事务管理的方法。该注解可以被应用于public方法上,对于非public方法,如果标记了@Transactional也不会报错,但...

    Spring事务介绍,分23类进行梳理

    10.Spring事务的回滚机制:使用回滚规则来控制事务的回滚,例如回滚异常、回滚超时等。 11.事务的隔离级别:使用隔离级别来控制事务的访问数据库的方式,例如READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、...

    spring mvc 事务配置+异常处理

    NULL 博文链接:https://gary-bu.iteye.com/blog/2025026

    Spring的声明式事务.doc

    本教程旨在深入讲解 Spring 的事务管理功能,包括编程式事务和声明式事务。通过学习本教程,您将能够理解 Spring 事务管理的本质,并灵活运用之。 一、事务管理的重要性 事务管理对于企业应用而言至关重要。它保证...

    子线程任务发生异常,主线程事务如何回滚

    子线程任务发生异常,主线程事务如何回滚? 本文将详细探讨当子线程任务发生异常时,如何让主线程捕获到该异常并进行事务的回滚。下面将从多线程编程的基础知识、线程池的使用、异常捕获三个方面进行阐述。 一、多...

    Spring 事务配置的五种方式.docx

    Spring事务类型详解: PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_...

    spring事务-项目案例-PPT解读.zip

    spring事务_案例_PPT 一、事务传播机制的demo案例,内容包括: 1.业务代码列举7种事务传播机制的情况,每个测试方法都附带日志分析记录、使用场景和实际场景,小白也能看得懂!!! 2.在测试类Test包下,使用juniter...

    全面分析Spring的编程式事务管理与声明式事务管理.doc

    全面分析 Spring 的编程式事务管理与声明式事务管理 本文将从 Spring 的事务管理入手,深入讲解编程式事务管理和声明式事务管理的实现机制和原理。通过本文的学习,您将能够理解 Spring 事务管理的本质,并灵活运用...

    详细整理Spring事务失效的具体场景及解决方案.docx

    Spring事务失效的常见场景有七种,分别是:注解@Transactional 配置的方法非 public 权限修饰、注解@Transactional 所在类非 Spring 容器管理的 bean、注解@Transactional 所在类中,注解修饰的方法被类内部方法调用...

    Spring2.5和Hibernate3集成--学习spring aop ioc

    * spring的事务管理需要添加到业务逻辑上(事务边界的定义),不要回到Dao上 技术提示: 在编写经下代码时: *" propagation="REQUIRED"/> *" propagation="REQUIRED"/> *" propagation="REQUIRED"/> *" ...

    Spring异常捕获且回滚事务解决方案

    主要介绍了Spring异常捕获且回滚事务解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics