问题:
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事务管理的好起点。通过理解如何配置事务管理器,使用`@Transactional`注解,以及异常处理机制,我们可以更好地掌握Spring如何保证数据的一致...
我们将深入探讨Spring事务管理的原理、API使用以及在实际开发中的应用。 首先,Spring事务管理有编程式和声明式两种方式。编程式事务管理通过`PlatformTransactionManager`接口和`TransactionDefinition`接口来实现...
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
在Spring框架中,事务管理是核心特性之一,用于确保数据操作的一致性和完整性。当一个方法(A方法)内部调用另一个方法(B方法)时,可能会遇到事务控制...这个示例代码对于理解和调试Spring事务管理的问题非常有帮助。
在Spring框架中,`@Transactional`注解是用于标记事务管理的重要工具,它使得开发者能够方便地在代码中声明式地控制事务的...通过实例分析和源码阅读,我们可以更深入地理解Spring事务管理机制,提升我们的编程技能。
标题中提到的“Spring事务管理只对出现运行期异常进行回滚”这一特性是基于Java异常处理机制的。在Java中,异常分为两种类型:运行时异常(RuntimeException及其子类)和检查异常(CheckedException)。运行时异常是...
本文主要关注的是声明式事务管理,尤其是涉及到事务异常回滚的实例解析。 首先,Spring 默认只有在遇到未捕获的 `RuntimeException` 或其子类时才会触发事务回滚。这意味着,如果在业务代码中对异常进行了捕获并...
Spring 异常捕获且回滚事务解决方案 在 Spring 框架中,异常捕获和回滚事务是非常重要的概念。今天,我们将讨论如何在 Spring 中捕获异常并回滚事务。 首先,让我们了解一下 Spring 的事务机制。当我们在 Spring ...
Spring 框架是Java开发中...理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在实际开发中,结合声明式事务管理、事务传播行为、隔离级别和回滚规则,可以有效地确保数据的完整性和一致性。
这是因为在Spring事务管理的实现中,默认情况下unchecked异常会被视作回滚异常。 除了异常外,方法的权限问题也会导致Spring事务管理失效。由于Java的继承机制,private、final、static修饰的方法不能被重写,因此...
#### Spring事务控制的基础概念 Spring框架支持两种类型的事务管理:编程式事务管理和声明式事务管理。 - **编程式事务管理**:通过编码的方式来管理事务,适用于需要细粒度控制的情况。 - **声明式事务管理**:...
回滚规则也是Spring事务管理的重要部分。通常,如果方法抛出未检查异常(继承自RuntimeException的异常)或Error,Spring会自动回滚事务。对于受检查异常(非RuntimeException),默认情况下不会回滚,但可以通过...
"spring事务操作主要对象.png"可能展示了Spring事务管理的关键组件,如TransactionDefinition(定义事务属性)、PlatformTransactionManager(事务管理器接口)、TransactionStatus(事务状态对象)等。这些对象协同...
Spring事务管理主要分为两种方式:编程式事务管理和声明式事务管理。编程式事务管理是通过编写代码来控制事务的开始、提交、回滚等操作,而声明式事务管理则是通过配置或注解来定义事务边界,更加直观和易于使用。 ...
Spring事务管理就是围绕这些特性来确保数据的一致性。 四、事务的传播行为 在Spring中,我们可以配置事务的传播行为,比如REQUIRED(默认,如果当前存在事务,则加入当前事务,否则新建一个事务)、PROPAGATION_...
Spring 的事务管理机制是一种典型的策略模式,PlatformTransactionManager 代表事务管理接口,他并不知道底层如何管理事务,他只要求事务管理的实现类提供开始事务、提交事务、回滚事务等方法。 在 Spring 中,有...
4. **回滚规则:**默认情况下,如果方法抛出未检查异常(继承自`RuntimeException`)或`Error`,Spring会自动回滚事务。你也可以自定义回滚规则,比如添加`@Transactional(noRollbackFor=SomeException.class)`来...
Spring事务注解的使用使得开发者可以轻松地在应用程序代码中控制事务边界,而无需手动管理数据库连接和事务。通过结合MySQL的事务隔离级别设置和Spring的事务管理,可以有效地确保数据一致性并优化并发性能。
1. RuntimeException回滚:SpringBoot默认情况下,只有RuntimeException及其子类的异常会导致事务回滚。 2. 手动回滚:使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();方法来手动回滚...