`

(转)spring AOP声明式事务异常回滚

    博客分类:
  • java
 
阅读更多

懒得自己写。备忘吧。

转自:http://hi.baidu.com/iduany/item/20f8f8ed24e1dec5bbf37df7

 

1).Spring的AOP即声明式事务管理默认是针对unchecked exception回滚。也就是默认对RuntimeException()异常或是其子类进行事务回滚;checked异常,即Exception可try{}捕获的不会回滚,如果使用try-catch捕获抛出的unchecked异常后没有在catch块中采用页面硬编码的方式使用spring api对事务做显式的回滚,则事务不会回滚, “将异常捕获,并且在catch块中不对事务做显式提交=生吞掉异常” ,要想捕获非运行时异常则需要如下配置:

解决办法:
1.在针对事务的类中抛出RuntimeException异常,而不是抛出Exception。
2.在txAdive中增加rollback-for,里面写自己的exception,例如自己写的exception:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
   <tx:attributes>
     <tx:method name="*" rollback-for="com.cn.untils.exception.XyzException"/>
   </tx:attributes>
 </tx:advice>
 
或者
定义不会滚的异常
<tx:advice id="txAdvice">
    <tx:attributes>
       <tx:method name="update*" no-rollback-for="IOException"/>
       <tx:method name="*"/>
    </tx:attributes>
 </tx:advice>
 
 
2).spring的事务边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit or rollback(Spring默认取决于是否抛出runtime异常).
 如果抛出runtime exception 并在你的业务方法中没有catch到的话,事务会回滚。 
 一般不需要在业务方法中catch异常,如果非要catch,在做完你想做的工作后(比如关闭文件等)一定要抛出runtime exception,否则spring会将你的操作commit,这样就会产生脏数据.所以你的catch代码是画蛇添足。
 
如:
try {  
    //bisiness logic code  
} catch(Exception e) {  
    //handle the exception  
}  

 由此可以推知,在spring中如果某个业务方法被一个 整个包裹起来,则这个业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出!全被捕获并吞掉,导致spring异常抛出触发事务回滚策略失效。
 不过,如果在catch代码块中采用页面硬编码的方式使用spring api对事务做显式的回滚,这样写也未尝不可。
 
 3).基于注解的事物:
 Transactional的异常控制,默认是Check Exception 不回滚,unCheck Exception回滚
 如果配置了rollbackFor 和 noRollbackFor 且两个都是用同样的异常,那么遇到该异常,还是回滚
 rollbackFor 和noRollbackFor 配置也许不会含盖所有异常,对于遗漏的按照Check Exception 不回滚,unCheck Exception回滚

分享到:
评论

相关推荐

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

    本篇文章将重点讨论如何在Spring框架中集成Hibernate,并探讨编程式事务管理和Spring AOP的声明式事务。 首先,让我们理解Spring与Hibernate的集成。为了整合这两个库,你需要在Spring配置文件中定义Hibernate的...

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

    在Spring框架中,声明式事务管理是通过AOP(面向切面编程)实现的,它为开发者提供了方便、高效且灵活的事务管理机制。本文将深入探讨如何利用Spring的声明式事务来处理业务操作中的数据一致性问题,以及相关源码...

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

    在“声明式事务管理”小程序中,我们可以看到如何在实际业务操作中,通过AOP和@Transactional注解,轻松实现事务的开启、提交、回滚,以及在各种异常情况下的事务处理。 通过学习这个小程序,开发者将能够熟练掌握...

    Spring ax/aop声明式事务配置实例

    通过以上步骤,我们成功地在Spring中实现了AOP声明式事务配置。这种方式使得事务管理与业务逻辑分离,代码更简洁、易维护。但需要注意,虽然声明式事务方便,但在复杂场景下可能需要结合编程式事务管理,以获得更高...

    spring 简单实例 事务回滚

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

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

    完美解决Spring声明式事务不回滚的问题 在实际应用中,Spring声明式事务管理是非常常见的,但是有...解决Spring声明式事务不回滚的问题需要我们了解事务管理的机制和原理,并避免在业务逻辑中使用try...catch异常。

    spring基于AOP实现事务

    总结一下,Spring基于AOP实现的事务管理通过TransactionProxyFactoryBean,结合声明式事务配置,能够提供一种高效且易于维护的事务解决方案。它允许我们在不修改业务逻辑的情况下,统一管理和控制事务,提升了代码的...

    spring+mybatis的声明式事务

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

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

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

    java springAOP 事务+注释

    声明式事务管理主要依赖于Spring的AOP机制。我们可以通过XML配置或注解来声明事务边界。例如,在服务层的方法上使用`@Transactional`注解,可以自动开启、提交或回滚事务。如果方法抛出未检查异常(继承自`...

    使用Spring的声明式事务----Annotation注解方式

    在Spring框架中,声明式事务管理是其核心特性之一,它允许开发者无需手动处理事务的开始、提交、回滚等操作,而是通过配置或者注解的方式进行声明,从而简化了事务管理的复杂性。本篇文章将深入探讨如何使用Spring的...

    Spring声明式事务处理

    声明式事务处理的核心是基于AOP(面向切面编程)的,Spring通过在事务边界添加通知(advice)来实现事务管理。这包括开始事务、提交事务、回滚事务等操作。用户只需在配置文件或使用注解来声明哪些方法需要在事务中...

    spring声明式事务处理demo

    编程式事务管理通常通过AOP(面向切面编程)的TransactionTemplate或PlatformTransactionManager接口直接在代码中控制事务,而声明式事务管理则是基于AOP的,通过配置XML或使用注解来定义事务边界。 1. **配置...

    Spring AOP管理Hibernate事务(TransactionInSpringAOP)

    编程式事务管理需要开发者显式调用开始、提交、回滚等事务管理API,而声明式事务管理则更简洁,只需要在配置中声明事务属性,由Spring自动处理事务的生命周期。 在Hibernate中,事务通常与数据库连接紧密相关,通过...

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

    - 声明式事务管理背后的实现原理是基于Spring的AOP(面向切面编程),它会在方法执行前后应用事务增强,从而实现事务的自动管理。 在提供的链接中,博主可能详细解释了这些概念,并给出了实际的应用示例,包括如何...

    mybatis 拦截器 + spring aop切面 + spring事务+ 反射工具类

    声明式事务管理通过@Transactional注解实现,可以在方法级别或类级别指定事务属性,如隔离级别、传播行为、回滚规则等。Spring事务管理器会自动处理开始事务、提交事务、回滚事务等操作,极大地简化了事务处理的复杂...

    spring事务异常回滚实例解析

    本文主要关注的是声明式事务管理,尤其是涉及到事务异常回滚的实例解析。 首先,Spring 默认只有在遇到未捕获的 `RuntimeException` 或其子类时才会触发事务回滚。这意味着,如果在业务代码中对异常进行了捕获并...

    Spring aop、jdbc和事务tx练习

    声明式事务管理允许开发者在配置文件中声明哪些方法需要在事务中运行,而无需在代码中显式管理开始和结束事务。这通常通过@Transactional注解实现,可以应用于类或方法级别。编程式事务管理则需要在代码中手动调用...

Global site tag (gtag.js) - Google Analytics