`
wangchuanyin
  • 浏览: 33128 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Spring中事物嵌套异常处理问题

 
阅读更多
描述A方法假如有2个操作分别是one operation,two operation.我们在方法A 上使用了@Transaction.定义了事物。要求如果two operation中如果抛出业务异常,则one operation要回滚,当two operation是Exception异常时不回滚one operation.

资料参考:
使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择声明式的事务管理,在spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。
那么什么是检查型异常什么又是非检查型异常呢?
最简单的判断点有两个:
1.继承自runtimeexception或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runtimeexception本身也是exception的子类)。
2.对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。所以必须在service捕获异常,然后再次抛出,这样事务方才起效。
结论:
在spring的事务管理环境下,使用unckecked exception可以极大地简化异常的处理,只需要在事务层声明可能抛出的异常(这里的异常可以是自定义的unckecked exception体系),在所有的中间层都只是需要简单throws即可,不需要捕捉和处理,直接到最高层,比如UI层再进行异常的捕捉和处理
在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。
Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked
如果遇到checked意外就不回滚。
如何改变默认规则:
1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

注意: 如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。

一个统一的异常层次结构对于提供服务抽象是必需的。 最重要的就是org.springframework.dao.DataAccessException以及其子类了。 需要强调的是Spring的异常机制重点在于应用编程模型。与SqlException和其他数据存取API不同的是: Spring的异常机制是为了让开发者使用最少, 最清晰的代码。DataAccessException和其他底层异常都是非检查性异常(unchecked exception)。 spring的原则之一就是基层异常就应该是非检查性异常. 原因如下:
1. 基层异常通常来说是不可恢复的。
2. 检查性异常将会降低异常层次结构的价值.如果底层异常是检查性的, 那么就需要在所有地方添加catch语句进行捕获。
3.try/catch代码块冗长混乱, 而且不增加多少价值。
使用检查异常理论上很好, 但是实际上好象并不如此。
Hibernate3也将从检查性异常转为非检查性异常。


方案:

  try{

  }catch(BussinessException e){
     throw e ;//only trow it ,the transaction can rollback.
  }catch(Exception e){// Exception checkException default noRoolback

}

具体的可根据事物进行配置,来决定哪些异常是否回滚。



分享到:
评论

相关推荐

    Spring声明式事务处理

    在压缩包中的文件可能包含了Spring声明式事务处理的详细教程、实例代码和常见问题解答等内容。文件名为`Spring声明式事务处理-1.mht`到`Spring声明式事务处理-5.mht`,通过阅读这些文件,你将能够深入理解Spring声明...

    Spring事务管理Demo

    在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理应用中的事务。Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何...

    Spring中事务的传播属性详解

    ### Spring中事务的传播属性详解 #### 一、引言 在使用Spring框架进行应用程序开发时,事务管理是一项非常重要的特性。Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。其中,声明式事务管理因其...

    Spring Nested事务简单案例

    4. **嵌套事务的深度**:理论上,你可以无限嵌套事务,但实际应用中应避免过深的嵌套,因为它可能导致性能问题,并增加代码的复杂性。 5. **事务隔离级别**:Nested事务继承了父事务的隔离级别,所以不需要额外设置...

    Spring事务传播机制.docx

    当出现多个事务嵌套的场景发生时,Spring 事务的处理会变得复杂一些,需要考虑嵌套事务下的提交顺序,以及回滚顺序。对此,Spring 提供了多种的传播机制,每种传播机制的效果都不尽相同,以便应对各种复杂的业务场景...

    spring 事务处理

    Spring 事务处理是Java开发中一个至关重要的概念,特别是在企业级应用中,它确保了数据的一致性和完整性。Spring 提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。本篇将深入探讨Spring声明式事务...

    深入理解spring的事务管理机制

    Spring框架的事务管理机制是在Java开发环境中非常重要的一个组成部分,它能够帮助开发者简化事务处理的复杂度,提高应用程序的一致性和可靠性。Spring事务管理的核心是基于AOP(面向切面编程)来实现的。 **Spring...

    spring 事务传播 demo

    在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理事务。本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将...

    spring 事务管理的理解

    在Spring的事务管理中,还有回滚规则和异常处理。默认情况下,运行时的检查异常(checked exception)不会导致事务回滚,而未检查异常(unchecked exception)和Error会。可以通过设置@Transactional注解的rollback...

    spring 事务基于注解模式

    在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。Spring提供了多种事务管理方式,其中基于注解的事务管理是近年来常用的模式,因为它简化了代码并提高了可读性。本文将...

    springboot整合spring事务

    8. **事务嵌套**:Spring支持事务嵌套,当一个事务方法被另一个事务方法调用时,Spring会创建一个子事务,子事务的提交或回滚不影响父事务。 9. **事务隔离级别**:包括`READ_UNCOMMITTED`、`READ_COMMITTED`、`...

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

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

    Spring事务传播Demo.zip

    总结来说,"Spring事务传播Demo"是一个用于学习和演示Spring事务管理和传播行为的实例,通过分析和实践这个Demo,开发者可以更好地理解和掌握Spring在处理事务时的复杂情况,提升在实际项目中的应用能力。...

    Spring事务管理配置文件问题排查

    当出现像描述中那样的问题——SQL语句执行出错但事务未回滚时,我们需要深入理解Spring事务管理的配置和机制。以下是一些关键知识点: 1. **Spring事务管理类型**: - **编程式事务管理**:通过`...

    第十四章 Spring4 切面事物与事物通知与传播行为

    本章将详细探讨Spring4中的切面事务处理、事物通知以及传播行为。 一、切面编程(AOP) 切面编程是Spring框架的一大特色,它允许开发者将关注点如日志记录、事务管理等从主业务逻辑中分离出来,形成独立的模块,即...

    spring+mybatis的声明式事务

    在IT领域,尤其是在Java开发中,Spring框架与MyBatis框架的结合是常见的技术栈,它们在处理数据库操作时,事务管理是至关重要的一个环节。本文将深入探讨"spring+mybatis的声明式事务"这一主题,帮助你理解并掌握这...

    Spring框架+Spring中的事务

    综上所述,Spring框架通过提供灵活且强大的事务管理机制,极大地简化了Java应用程序中的事务处理逻辑,使得开发者可以更加专注于业务逻辑的实现。通过对事务传播机制和隔离级别的深入了解,可以更好地设计和实现高...

    spring事物传播测试表

    总之,“Spring事物传播测试表”是学习和掌握Spring事务管理的重要工具。通过对各种传播行为的测试和分析,开发者能够更好地理解Spring事务的运作机制,从而在实际项目中编写出更加健壮和可靠的代码。在实际工作中,...

    Spring 事务 代码

    本示例将探讨Spring中的声明式事务处理,这是一个基础但实用的例子。 首先,我们要理解什么是Spring的声明式事务。声明式事务管理是Spring提供的一种透明化的事务管理方式,开发者无需编写显式的事务控制代码,只...

Global site tag (gtag.js) - Google Analytics