在目前使用的现有框架当中,利用spring的AOP机制来控制事务处理是目前最流行的一种控制事务的方式。<o:p></o:p>
但是我们在某种使用场合的过程中,为什么有时事务处理老是不起作用呢?这里,为您道出原因之一,<o:p></o:p>
<o:p></o:p>
首先请看一段话<o:p></o:p>
Spring的事务实现采用基于AOP的拦截器来实现,如果没有在事务配置的时候注明回滚的checked exception,那么只有在发生了unchecked exception的时候,才会进行事务回滚。<o:p></o:p>
<o:p></o:p>
有必要先解释一下checked exception与unchecked exception:<o:p></o:p>
先看看EXCEPTION在JDK文档当中的结构<o:p></o:p>
java.lang.Object<o:p></o:p>
java.lang.Throwable<o:p></o:p>
java.lang.Exception<o:p></o:p>
java.lang.RuntimeException<o:p></o:p>
<o:p> </o:p>
而Unchecked exception: 这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是特殊的。Exception是作为checked Exception 出现的。<o:p></o:p>
所以,除了Error与RuntimeException,其他剩下的异常都是你需要关心的,而这些异常类统称为Checked Exception<o:p></o:p>
<o:p> </o:p>
有了以上的基础,看看我们框架当中的事务属性<o:p></o:p>
<property name="transactionAttributes"><o:p></o:p>
<props><o:p></o:p>
<prop key="get*">PROPAGATION_REQUIRED,readOnly </prop><o:p></o:p>
<prop key="save*">PROPAGATION_REQUIRED </prop><o:p></o:p>
<prop key="delete*">PROPAGATION_REQUIRED</prop><o:p></o:p>
<prop key="update*">PROPAGATION_REQUIRED </prop>
</props> <o:p></o:p>
<o:p> </o:p>
</property><o:p></o:p>
<o:p> </o:p>
此处,我们没有指定任何异常,那么它目前默认处理的就是unchecked exception了,再结合我们自身每个项目的模块,在我们的每个项目当中几乎都定义了自己的异常,这些异常都是继承自Exception,很不幸的是,我们继承的Exception包括自己定义的异常,都是checked exception。<o:p></o:p>
<o:p> </o:p>
所以,在我们的事务处理机制当中,事务不管用了。<o:p></o:p>
解决办法有2个:<o:p></o:p>
1,在事务属性后面加上需要回滚的checked exception。比如<prop key="save*">PROPAGATION_REQUIRED,-XXXXException</prop>(注意那个"-",对应的是"+")<o:p></o:p>
2, 不改配置文件,将需要事务回滚的异常继承自unchecked exception类,也就是RuntimeException。
分享到:
相关推荐
### Spring AOP 实现流程日志跟踪 #### 一、背景与目的 在现代软件开发过程中,为了确保系统的稳定性和可维护性,通常会引入非功能性的需求来增强应用程序的功能,比如日志记录、安全控制等。这些需求往往不是业务...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为应用程序提供了声明式的企业级服务,如日志、事务管理等。在本项目中,我们将探讨如何通过配置文件实现Spring AOP...
在本案例中,"aop+exception"的测试代码可能涉及到如何在Spring框架中使用AOP来处理异常。 首先,让我们深入了解一下AOP。Spring AOP是Spring框架的一个重要组成部分,它允许开发者定义“切面”,即跨越多个对象的...
在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许程序员将关注点分离,例如日志记录、事务管理、权限检查等,从核心业务逻辑中解耦出来。本篇主要探讨的是如何利用Spring AOP的注解来实现这些功能,...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现代码的横切关注点,如日志记录、事务管理、性能监控等。在这个"spring aop API示例"中,我们将深入探讨如何利用Spring AOP的四...
Spring AOP,即Spring的面向切面编程,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强或统一处理的方法。本文将围绕Spring AOP的源码分析,探讨其核心概念、工作原理以及在...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理)从核心业务逻辑中解耦出来。本篇我们将深入探讨如何使用注解的方式来实现Spring AOP开发。 ...
在Spring MVC中,AOP常用于处理全局异常、事务管理和安全控制。例如,你可以创建一个异常处理切面,捕获所有控制器方法抛出的异常并统一处理: ```java @Aspect public class ExceptionHandlingAspect { @...
### Spring框架+SpringAOP动态代理 #### 一、Spring AOP 动态代理概述 在探讨Spring AOP(Aspect-Oriented Programming,面向切面编程)中的动态代理之前,我们首先简要回顾一下AOP的基本概念。面向切面编程是一种...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。本篇文章将深入探讨Spring AOP中的5种增强方法,以及如何...
Spring AOP,全称为Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,主要用来处理系统中的横切关注点,如日志、事务管理、权限控制等。通过AOP,我们可以将这些分散在代码各处的重复逻辑...
Spring注解AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的一个重要特性,它使得开发者可以在不修改原有代码的情况下,通过添加注解来实现横切关注点,如日志、事务管理等。下面我们将深入探讨...
<bean id="testBeforeAdvice" class="com.company.springaop.test.TestBeforeAdvice" /> <bean id="beanImpl" class="com.company.springaop.test.BeanImpl" /> ``` 在这个配置中,`aop:before`元素定义了一个切点...
在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式处理应用中的事务。本文将深入探讨如何基于AOP(面向切面编程)来实现Spring的事务管理,特别是通过TransactionProxyFactoryBean。让...
Could not instantiate bean class [org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: ...
Spring AOP,全称为Aspect Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为应用程序提供了一种模块化和声明式的方式来处理交叉关注点,如日志、事务管理、性能监控等。AOP的核心概念是切面...
总之,Spring AOP提供了一种优雅的方式来处理应用程序中的横切关注点,如日志记录。通过定义切面和切入点,我们可以无侵入地记录方法执行的相关信息,这对问题排查和系统监控至关重要。对于初学者来说,理解并掌握...
**Spring AOP - Advice** Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了在不修改源代码的情况下,对程序进行功能增强的一种机制。Advice是AOP中的核心概念,代表了在特定连接点(Join Point)...
在Spring Boot应用中,AOP(面向切面编程)是一种强大的工具,用于实现代码的解耦和模块化,尤其适用于处理横切关注点,如日志记录、事务管理、安全控制等。本教程将深入探讨如何利用Spring Boot的AOP特性来实现日志...