`

关于Spring 声明式事务处理时,throws exception不回滚的问题

 
阅读更多

前一段时间,项目代码评审,发现有TX不使用Spring的事务处理,而直接封装方法,手动进行数据的回滚,得悉原因是:抛出异常以后事务不起作用,没有回滚。这理由顿时让人很无语,不过还算个聪明的TX,知晓另辟蹊径,但是在insert的时候,手动回滚直接delete就可以了,如果是update,不晓得还会有什么更犀利的办法。

      仔细评审代码细节,发现该TX压根没有按照框架原先设计在service层throws BusinessException,而是直接throws Exception。Spring配置异常回滚采用的是rollback-for=“BusinessException”。TX提出疑问:Spring不是抛出异常事务就会回滚么?带着疑问,查阅资料,分析源代码,最终找到想要的答案。这一切来源于java的检查性异常、非检查性异常的区别。

      使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择声明式的事务管理,在spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。
那么什么是检查型异常什么又是非检查型异常呢?
最简单的判断点有两个:
1.继承自runtimeexception或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runtimeexception本身也是exception的子类)。
2.对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。所以必须在service捕获异常,然后再次抛出,这样事务方才起效。

分享到:
评论

相关推荐

    完美解决Spring声明式事务不回滚的问题

    完美解决Spring声明式事务不回滚的问题 在实际应用中,Spring声明式事务管理是非常常见的,但是有时候我们可能会遇到事务不回滚的问题。今天,我们就来讲解究竟是什么原因导致了事务不回滚,如何来解决这个问题。 ...

    spring事务管理

    Spring事务管理主要包括两种类型:编程式事务管理和声明式事务管理。 - **编程式事务管理**:通过编写代码来控制事务的开始、提交或回滚等操作。这种方式灵活度高,但会使得代码变得冗余且难以维护。 - **声明式...

    详细介绍Spring事务管理

    Spring框架作为Java企业级应用中的佼佼者,提供了强大的事务管理功能,支持编程式事务管理和声明式事务管理。 #### 二、Spring事务管理策略 Spring框架中事务管理的核心策略是通过`PlatformTransactionManager`...

    Spring(IOC,APD,声明式事物的例子)

    让我们深入探讨这些概念以及如何在Spring中实现声明式事务管理。 **1. Inversion of Control (IoC)** IoC,也称为依赖注入(Dependency Injection),是一种设计模式,它将对象的创建和管理权交给了框架,而不是由...

    spring 事务配置

    本文详细介绍了Spring事务配置中的五种方式:基于XML的声明式事务管理、基于注解的声明式事务管理、编程式事务管理、通过AOP实现的事务管理以及通过代理模式实现的事务管理。每种方式都有其适用场景,开发者可以根据...

    Java ee 企业应用开发:第7章 在Spring中管理事务.ppt

    2. **声明式事务管理**:更常用且推荐的方式,通过配置元数据(XML或注解)定义事务边界,Spring自动处理事务生命周期。声明式事务管理基于AOP,可以在方法调用前开始事务,方法结束后根据执行情况决定提交或回滚。 ...

    JAVA设计模式之事务处理

    当涉及事务处理时,设计模式可以帮助我们构建健壮、可维护的应用程序。"JAVA设计模式之事务处理"主要关注如何在业务逻辑中有效地管理和控制事务。 事务处理在企业级应用中至关重要,因为它确保数据的一致性和完整性...

    Spring JDBC实现代码

    在事务管理方面,Spring提供了编程式和声明式事务处理。在描述中提到了编程式事务,这通常涉及在业务逻辑中手动开启、提交和回滚事务。下面是一个示例: ```java @Autowired private PlatformTransactionManager ...

    Spring事务配置的五种方式

    其中,声明式事务因其简单易用而被广泛采用。本文将详细介绍Spring中事务配置的五种方式,帮助开发者更好地理解和运用这些配置方法。 #### 二、Spring事务配置的基本组成部分 Spring事务配置主要包含以下三个部分:...

    JdbcTemplate的事务控制.docx

    ### JdbcTemplate 的事务...在实际开发中,推荐使用Spring的声明式事务管理,因为它更加简单易用,并且与业务逻辑的耦合度更低。同时,需要注意的是,在处理异常情况时,一定要确保资源的释放,避免资源泄露的问题。

    spring-aop.rar_aop1270_spring_spring aop

    Spring AOP,即Spring的面向切面编程,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强或统一处理的方法。本文将围绕Spring AOP的源码分析,探讨其核心概念、工作原理以及在...

    ssh-aop笔记

    Spring AOP是Spring框架的一部分,它提供了声明式事务管理、日志记录、性能监控等功能。AOP通过切面(Aspect)来封装这些横切关注点,使得核心业务逻辑代码更加清晰。切面由切点(Pointcut)、通知(Advice)和织入...

    Spirng-JdbcTemplate资料.docx

    声明式事务管理则更简洁,通过在XML配置文件中定义事务的传播行为和隔离级别,让Spring自动处理事务的生命周期。例如,在`applicationContext.xml`中配置: ```xml <bean id="transactionManager" class="org....

    spring-aop-3.2.0.RELEASE-sources.jar.zip

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它为开发者提供了声明式事务管理、日志记录、性能监控等跨切面的关注点。在Spring 3.2.0.RELEASE版本中,AOP功能进一步完善,...

    aspectj用的的jar包

    面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,旨在将横切关注点(如日志、事务管理、权限控制等)与核心...在实际开发中,结合Spring框架,可以实现声明式事务管理,大大提高开发效率和代码质量。

    IBATIS SQL Maps 入门教程.pdf

    在Spring环境中,通常使用声明式事务管理,通过`@Transactional`注解来控制事务的开始、提交和回滚。 **总结** Ibatis以其简洁、灵活的特性深受开发者喜爱。通过这个入门教程,你应该对Ibatis的基本使用有了初步...

    java面试题-解密版

    - `throws`:声明方法可能抛出的异常。 - `throw`:手动抛出异常。 - `try`:包含可能抛出异常的代码块。 - `catch`:捕获并处理特定类型的异常。 - `finally`:无论是否发生异常都会执行的代码块。 - 在`try`块中...

Global site tag (gtag.js) - Google Analytics