`
bnmnba
  • 浏览: 293584 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

spring 声明式事务配置,主动抛出异常不回滚。

 
阅读更多

默认spring只在发生未被捕获的RuntimeException时才回滚。

 

原文:http://blog.csdn.net/ky498320858/article/details/6576121

 

 

最笨的办法:代码级控制:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

 

为何在aop  advitor中配置rollba-for=“java.lang.Exception”异常时不回滚呢?

 

待续,这个问题必须解决

 

 

问题已解决:

 

原理:spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获RuntimeException的异常,但可以通过
<tx:method name="upd*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
配置来捕获特定的异常并回滚

换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new RuntimeException(),这样程序异常时才能被aop捕获进而回滚

 

解决方案:

方案1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理

方案2.在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常(现在项目的做法)

 


 <bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
 </bean>

 <tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
   <tx:method name="add*" propagation="REQUIRED" />
   <tx:method name="upd*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
   <tx:method name="del*" propagation="REQUIRED" />
   <tx:method name="*" propagation="SUPPORTS" />
  </tx:attributes>
 </tx:advice>

 <aop:config>
  <aop:pointcut id="canyin" expression="execution(* com.laphone.base.baseservice.*.*(..)) ||execution(* com.laphone.canyin.*.service.*.*(..)) || execution(* com.laphone.canyin.*.*.service.*.*(..))"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="canyin" />
 </aop:config>

 

分享到:
评论

相关推荐

    spring声明式事务管理配置方式

    在"spring声明式事务管理配置方式"中,主要涉及到以下几个关键知识点: 1. **Spring事务管理器(Transaction Manager)**: - Spring支持多种事务管理器,如DataSourceTransactionManager(用于JDBC事务)和...

    spring 简单实例 事务回滚

    Spring 提供了声明式事务管理,这是通过在配置文件或使用注解来声明事务边界的方式。例如,我们可以使用`@Transactional`注解来标记一个方法为事务方法。当这个方法执行时,Spring会自动开启一个事务,执行方法内的...

    Spring声明式事务处理

    文件名为`Spring声明式事务处理-1.mht`到`Spring声明式事务处理-5.mht`,通过阅读这些文件,你将能够深入理解Spring声明式事务处理的各个方面,包括配置、使用场景、最佳实践以及常见问题的解决方法。

    Spring声明式事务配置管理方法

    以下是关于Spring声明式事务配置管理的详细说明: 1. **事务管理器配置**: 在`/WEB-INF/applicationContext.xml`文件中,我们需要定义一个事务管理器Bean。通常,对于Hibernate,我们会使用`...

    Spring 事务 (二) Spring 声明式事务 配置

    本文主要探讨Spring声明式事务管理的配置,这是Spring提供的一种简便的事务管理方式,允许开发者在不编写任何事务管理代码的情况下实现事务控制。这种方式极大地提高了代码的可维护性和可读性。 首先,我们要理解...

    spring声明式事务处理demo

    在这个"spring声明式事务处理demo"中,我们将探讨如何在MyEclipse环境下实现这一功能。 首先,我们要理解Spring事务管理的两种主要方式:编程式事务管理和声明式事务管理。编程式事务管理通常通过AOP(面向切面编程...

    spring声明事务的配置

    Spring声明式事务管理是Spring框架的核心特性之一,它允许开发者在不侵入业务代码的情况下,对应用程序的事务进行管理。这种方式极大地提高了代码的可维护性和灵活性。以下是对Spring声明式事务配置的详细说明: 1....

    spring+mybatis的声明式事务

    在Spring中,声明式事务主要通过AOP(面向切面编程)实现,它允许我们在不修改业务代码的情况下,通过XML配置或Java配置,以及注解来控制事务的边界。 3. **XML配置事务** 在Spring的XML配置文件中,可以通过`...

    spring声明式事务.zip

    本文将深入探讨Spring声明式事务的实现机制、优缺点以及如何在实际项目中进行配置和使用。 1. **声明式事务管理概述** 声明式事务管理与编程式事务管理相对,后者需要开发者在代码中显式调用开始、提交、回滚等...

    使用Spring的声明式事务----AOP方式

    在Spring中,我们主要通过两种方式配置声明式事务:XML配置和注解配置。 1. XML配置:在`&lt;tx:advice&gt;`元素中定义事务行为,然后通过`&lt;aop:config&gt;`或`&lt;aop:aspect&gt;`将事务行为应用到特定的bean或方法上。例如: ```...

    全面分析 Spring 的编程式事务管理及声明式事务管理

    1. **基于XML的声明式事务管理**: 在Spring的配置文件中,我们可以通过`&lt;tx:advice&gt;`、`&lt;aop:config&gt;`等元素定义事务的边界,指定哪些方法需要在事务中运行。 2. **基于注解的声明式事务管理**: 使用@Transactional...

    Spring事务管理A方法内部调用B方法的回滚问题测试代码

    如果A方法抛出异常,Spring会根据@Transactional的配置回滚整个事务,包括A方法和B方法中的操作。 ```java @Service public class MyService { @Transactional public void methodA() { // 执行一些操作 try ...

    深入理解Spring声明式事务:源码分析与应用实践

    Spring声明式事务是Java开发中不可或缺的一部分,它利用Spring的AOP(面向切面编程)和代理机制,为开发者提供了一种简洁的方式来管理事务。在本文中,我们将深入探讨Spring声明式事务的工作原理,源码分析,以及...

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    4. **异常处理**: 声明式事务管理基于异常驱动,当方法抛出未检查异常(继承自`RuntimeException`)或`Error`时,事务会自动回滚;而检查异常(非`RuntimeException`)则不会触发回滚,除非在注解中指定了`rollback...

    spring几种事务配置详解【精】

    声明式事务管理是Spring最常用的方式,它将事务管理与业务逻辑解耦,通过AOP(面向切面编程)实现。主要有两种实现方式: - **基于XML的声明式事务管理** 在Spring的配置文件中,通过`&lt;tx:advice&gt;`标签定义事务...

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

    例如,如果你有一个方法声明了可能抛出IOException(这是一个检查异常),并且该方法在Spring的事务管理下执行,那么即使方法抛出了IOException,事务也不会自动回滚。相反,你需要显式地处理这个异常,比如通过try-...

    spring编程式事务实现

    默认情况下,如果在事务回调中抛出未检查异常(继承自`RuntimeException`)或`Error`,Spring会自动回滚事务。对于已检查异常,需要显式设置`rollbackFor`属性,或在`TransactionCallback`中调用`TransactionStatus...

    spring AOP(声明式事务管理)小程序

    在本“spring AOP(声明式事务管理)小程序”中,我们将深入探讨Spring AOP如何实现声明式事务管理,以及相关的通知类型。 1. **什么是声明式事务管理**: 声明式事务管理是相对于编程式事务管理而言的,后者需要在...

    spring3、 hibernate4 配置声明式事务管理(annotation方式)

    本篇将详细介绍如何在Spring 3和Hibernate 4中配置声明式事务管理,采用注解方式。 一、Spring的事务管理 Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式地调用...

Global site tag (gtag.js) - Google Analytics