在目前使用的现有框架当中,利用spring的AOP机制来控制事务处理是目前最流行的一种控制事务的方式。
但是我们在某种使用场合的过程中,为什么有时事务处理老是不起作用呢?这里,为您道出原因之一,
首先请看一段话
Spring的事务实现采用基于AOP的拦截器来实现,如果没有在事务配置的时候注明回滚的checked exception,那么只有在发生了unchecked exception的时候,才会进行事务回滚。
有必要先解释一下checked exception与unchecked exception:
先看看EXCEPTION在JDK文档当中的结构
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.RuntimeException
而Unchecked exception: 这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是特殊的。Exception是作为checked Exception 出现的。
所以,除了Error与RuntimeException,其他剩下的异常都是你需要关心的,而这些异常类统称为Checked Exception
有了以上的基础,看看我们框架当中的事务属性
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly </prop>
<prop key="save*">PROPAGATION_REQUIRED </prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED </prop>
</props>
</property>
此处,我们没有指定任何异常,那么它目前默认处理的就是unchecked exception了,再结合我们自身每个项目的模块,在我们的每个项目当中几乎都定义了自己的异常,这些异常都是继承自Exception,很不幸的是,我们继承的Exception包括自己定义的异常,都是checked exception。
所以,在我们的事务处理机制当中,事务不管用了。
解决办法有2个:
1,在事务属性后面加上需要回滚的checked exception。比如<prop key="save*">PROPAGATION_REQUIRED,-XXXXException</prop>(注意那个"-",对应的是"+")
2, 不改配置文件,将需要事务回滚的异常继承自unchecked exception类,也就是RuntimeException。
(nighthawk)
感谢:http://www.blogjava.net/nighthawk/archive/2007/07/09/128974.html
相关推荐
好多项目都有容错机制 后台服务器报错后 不是讲错误信息直接发给用户 而是发送一个其他页面 你在上网的时候应该遇到过后台出错了 用户看到的页面是一个小孩在哭 提示页面找不到什么的
在实际项目中,处理异常是必不可少的一部分,Spring Boot为此提供了强大的异常处理机制。本篇将深入探讨Spring Boot的异常处理器,帮助你更好地理解和运用。 1. **Spring Boot异常处理基础** Spring Boot默认提供...
本话题主要围绕Logback的过滤器(Filter)、组件(Component)以及Spring异常处理器(Exception Resolver)进行深入探讨。 1. **Logback过滤器(Filter)**: Logback允许我们通过过滤器来控制哪些日志事件会被...
这个实例可能用来演示如何在Spring 2.5.6中配置、管理和操作数据库,特别是与图像数据相关的操作。由于提及了“oracle-schema.txt”,我们可以推断这个示例可能使用Oracle数据库,并且“oracle-schema.txt”文件包含...
### Spring中的JdbcTemplate #### JdbcTemplate概述 JdbcTemplate是Spring框架提供的一种用于简化JDBC编程的对象。通过封装原生的JDBC API,JdbcTemplate不仅提高了代码的可读性和可维护性,还帮助开发者避免了...
- **错误处理**:在解析或评估过程中可能出现 `ParseException` 和 `EvaluationException` 异常。 #### 八、结论 Spring SpEL 提供了一种强大且灵活的方式来处理运行时数据和对象图。通过理解其核心概念和组件,...
在客户管理系统中,为了实现对所有DAO类中以`save`开头的方法进行权限验证,可以使用Spring AOP的注解方式来实现。 ##### 2.3 实现步骤 1. **引入相关Jar包**:首先需要引入Spring AOP所需的Jar包,包括Spring的...
6. **异常处理(Exception Handling)**:当安全规则不满足时,Spring Security会抛出相应的异常,你可以自定义这些异常的处理逻辑。 7. **表达式语言(Expression Language)**:Spring Security提供了一个强大的...
spring-rest-exception-handler, 一个方便的RESTful api Spring MVC 异常 spring REST异常处理程序 这个项目的目的是为for提供一个方便的异常处理程序( 解析器),它满足了错误响应的最佳实践。 处理自定义异常。...
在Spring框架中,Spring Security是一个强大的安全访问控制组件,它为Web应用提供了全面的安全管理解决方案。本篇文章将深入探讨如何在Spring 3中整合Spring Security来实现权限控制,以保护你的应用程序免受非法...
《Spring Boot Assistant插件在IntelliJ IDEA中的应用与实践》 在当今的软件开发领域,Spring Boot框架因其简洁、高效的特点,深受开发者喜爱。为了提高开发效率,IntelliJ IDEA,作为一款强大的Java集成开发环境,...
这里我们关注后者,通过 Spring 注入 SessionFactory 到 DAO 类中,然后在业务方法中打开和关闭 Session,处理事务。例如: ```java public class DepartmentDapImpl implements IDepartmentDao { private ...
首先,在项目的 `pom.xml` 文件中添加 Spring Boot、Spring Security 和 Spring Data JPA 的依赖。例如: ```xml <groupId>org.springframework.boot <artifactId>spring-boot-starter-data-jpa <groupId>org...
在Spring Cloud 2.0版本中,Eureka Server的配置相比1.x版本确实有了一些显著的变化,尤其是在结合Spring Security进行安全设置时。Spring Cloud Eureka是Netflix Eureka的Spring Boot实现,它为微服务架构提供了...
这个"狂神spring-security静态资源.zip"文件很可能包含了Spring Security的相关教程、代码示例或配置文件,帮助用户理解和学习如何在Spring应用中实现安全控制。下面我们将深入探讨Spring Security的核心概念、功能...
nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'transactionManagerBeanName' of bean class [org.springframework.transaction.interceptor....
首先,集成Spring Security到Spring Boot项目中,你需要在`build.gradle`或`pom.xml`文件中添加相应的依赖。对于Maven项目,可以在`pom.xml`中添加如下依赖: ```xml <groupId>org.springframework.boot ...
5. **异常处理(Exception Handling)**:Spring Security 自带了一套完整的异常处理机制,包括未授权和未认证的异常。通过自定义`AccessDeniedHandler`和`AuthenticationEntryPoint`,你可以控制用户在访问受限资源...
压缩包中的`spring-exception-handling-master`很可能包含了以下组件: - `src/main/java`: 包含自定义异常处理器的Java源代码。 - `src/main/resources`: 可能包含了配置文件,如`application.properties`,用于...
首先,集成Quartz到Spring项目中,我们需要在项目的`pom.xml`或`build.gradle`文件中添加Quartz和Spring相关的依赖。Quartz的核心库通常包括`quartz`和`quartz-jobs`两个JAR包,确保它们在项目类路径下可用。 接...