`
zzc1684
  • 浏览: 1190425 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Spring管理事务默认回滚的异常是什么?

阅读更多

 

问题:

Spring管理事务默认(即没有rollBackFor的情况下)可以回滚的异常是什么?

回答:

RuntimeException或者Error。

抛出运行时异常,是否回滚?Yes

    @Transactional  
    public boolean rollbackOn(Throwable ex) {  
        return new RuntimeException();  
    }  

 

抛出错误,是否回滚?Yes

    @Transactional  
    public void testTransationB(){  
        throw new Error();  
    }  

 

抛出非运行时异常,是否回滚?No

    @Transactional  
    public void testTransationC() throws Exception{  
        throw new Exception();  
    }  

 

抛出非运行时异常,有rollBackFor=Exception.class的情况下,是否回滚?Yes

    @Transactional(rollbackFor = Exception.class)  
    public void testTransationD() throws Exception{  
        throw new Exception();  
    }  

 

分析:

请看Spring源码类RuleBasedTransactionAttribute:

    public boolean rollbackOn(Throwable ex) {  
        if (logger.isTraceEnabled()) {  
            logger.trace("Applying rules to determine whether transaction should rollback on " + ex);  
        }  
      
        RollbackRuleAttribute winner = null;  
        int deepest = Integer.MAX_VALUE;  
      
        if (this.rollbackRules != null) {  
            for (RollbackRuleAttribute rule : this.rollbackRules) {  
                int depth = rule.getDepth(ex);  
                if (depth >= 0 && depth < deepest) {  
                    deepest = depth;  
                    winner = rule;  
                }  
            }  
        }  
      
        if (logger.isTraceEnabled()) {  
            logger.trace("Winning rollback rule is: " + winner);  
        }  
      
        // User superclass behavior (rollback on unchecked) if no rule matches.  
        if (winner == null) {  
            logger.trace("No relevant rollback rule found: applying default rules");  
            return super.rollbackOn(ex);  
        }  
              
        return !(winner instanceof NoRollbackRuleAttribute);  
    }  

 

其中

ex:程序运行中抛出的异常,可以是Exception,RuntimeException,Error;

rollbackRules:代表rollBackFor指定的异常。默认情况下是empty。

所以默认情况下,winner等于null,程序调用super.rollbackOn(ex)

Here is the source code of super.rollbackOn(ex)

    public boolean rollbackOn(Throwable ex) {  
        return (ex instanceof RuntimeException || ex instanceof Error);  
    }  

 

真相大白,结论是,默认情况下,如果是RuntimeException或Error的话,就返回True,表示要回滚,否则返回False,表示不回滚。

有rollBackFor的情况就不分析啦,这个也是可以触类旁通的。

 

 

分享到:
评论

相关推荐

    Spring事务管理只对出现运行期异常进行回滚

    Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚,需要了解更多Spring事务方面的知识,可详看本

    Spring2.5和Hibernate3集成--学习spring aop ioc

    * 默认事务回滚异常是RuntiimeException(包括所有继承RuntimeException的子类).普通异常不回滚 * 在编写业务逻辑方法时,最好将异常一直往上抛出,由表示层处理(Struts) * spring的事务管理需要添加到业务逻辑上...

    SpringBatch+Spring+Mybatis+MySql (spring batch 使用jar)

    Spring Batch可以提供大量的,可重复的数据处理功能,包括日志记录/跟踪,事务管理,作业处理统计工作重新启动、跳过,和资源管理等重要功能。 业务方案: 1、批处理定期提交。 2、并行批处理:并行处理工作。 3、...

    Spring.html

    默认-1(永不超时),事务一直不提交也不回滚的时间 是否只读: 默认false TransactionManagerStatus: 事务的一些状态 整合 Spring整合Junit 1.导入依赖spring-test 2.加注解:RunWith、...

    Spring_doc

    Spring的事务管理通过AOP代理来实现 根据事务属性,对每个代理对象的每个方法进行拦截, 在方法执行前启动事务, 方法执行完毕后根据是否有异常和异常种类进行... spring 默认通过捕获运行时异常实现事务提交或回滚

    Spring_Hibernate集成

    * 默认情况下运行期异常才会回滚(包括继承了RuntimeException子类),普通异常是不会滚的 * 编写业务逻辑方法时,最好将异常一直向上抛出,在表示层(struts)处理 * 关于事务边界的设置,通常设置到业务层,...

    spring chm文档

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 插入事务操作 9.5.8. ...

    Spring中文帮助文档

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知...

    Spring API

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知...

    Spring4Mybatis:这是一个Spring MVC + Mybatis 的项目,不仅仅只是简单的demo或是增删改查,她将含括很多的方面:尽量抽取basedao,baseService公共部分,做出一个简单的framework,为以后分布式开发提供基础

    Spring事务管理(默认只对RuntimeException或是其子类回滚) 异常处理(ExceptionHandler) JMS消息处理机制 Mybatis与Spring的整合,并且 Junit Log4j SpringMVC整合页面所有操作,form,file,pic,input,radio,...

    OA系统整体设计及约定、搭建环境.rar_OA系统及配置_OA系统整体设计及约定、搭建环境_creation

    使用S执行hibernate操作时,hibernate的操作默认必须包含在一个transaction中,也就是开始要用得到一个transaction 实例(譬如),操作结束时在这个实例上进行事务的提交或回滚如果这些CRUD操作不被包括在一个具体的...

    pikaQ:分布式可靠消息组件

    解决部分分布式事务一致性问题:默认事务发生后一定成功的条件下,保证事务一致性,无法支持分布式事务回滚 可靠、简单、统一、通用 适用于: 想通过消息队列作为各个系统的传输中间件,并达到分布式事务一致性 要求...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【Spring】Spring事务机制 93 声明式事物 93 编程式事务 94 【Spring】Spring声明式事务的五个特性 94 传播性 94 隔离级别 95 只读 96 事务超时 97 回滚规则 97 【Spring】SpringMVC请求处理流程 97 【Mybatis】...

    JDBC总结——事务

    文章目录事务一、事务的基本介绍1、概念2、操作3、操作实例4、MySQL数据库中默认自动提交二、事务的四大特征三、事务的隔离级别1、概念2、存在的问题3、隔离级别四、Jdbc事务控制1、概述2、控制事务的API:3、核心...

    shine-mq:Reliable message distributed transaction middleware(可靠消息分布式事务中间件) :sparkles:

    分布式事务支持异常回滚 可靠的消息默认存储:redis(自我实现) 当前消息传递中间件支持:rabbitmq :spouting_whale: 玛文 &lt;groupId&gt;top.arkstack &lt;artifactId&gt;shine-mq &lt;version&gt;2.2.1 :ribbon: 分布式...

    JMS入门Demo

    该属性值默认为false,这样JMS在进行消息监听的时候就会进行事务控制,当在接收消息时监听器执行失败时JMS就会对接收到的消息进行回滚, 对于SessionAwareMessageListener在接收到消息后发送一个返回消息时也处于...

    spring-boot-rest-framework

    dao采用mybatis 3.3.0 + tk.mybatis通用Mapper3.1.3 , 支持事务回滚 ####web容器 内嵌tomcat容器,默认开启gzip压缩 ####日志及监控 所有controller层的参数利用AOP机制自动记录日志及自动计算服务端耗时(毫秒数) ###...

    jta:Springboot + Atomikos + Druid + Mysql 实现JTA分布式事务

    jta Springboot + Atomikos + Druid + Mysql 实现JTA分布式事务 问题一:Druid 和 Mysql 版本的问题 问题二:Springtest 默认情况下事务回滚 Mysql对XA协议支持不好,有待看

    乐优商城.xmind

    使用默认配置,抛出异常之后,事务会自动回滚,数据不会插入到数据库。 setId(null) insert(brand) 新增中间表 mapper @Insert (#{cid},#{bid}) @Param 表示给参数命名,名称就是括号中的内容 name 命名为...

    J2EE面试题

    c) EJB有Bean管理事务和容器管理事务两种方式 d) BMT方式也可以使用JTA来控制事务边界 参考答案 19) 关于消息确认描述正确的是 ac a) 在创建消息会话的时候能指定消息的确认方式 b) AUTO_ACKNOWLEDGE方式...

Global site tag (gtag.js) - Google Analytics