首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring Transaction :为两者定义的rollbackfor和norollbackfor

Spring Transaction: rollbackFor 和 noRollbackFor

基础概念

Spring框架提供了强大的事务管理功能,允许开发者通过注解或XML配置来声明事务边界。@Transactional 是最常用的注解之一,用于指定事务的传播行为、隔离级别以及回滚规则。

rollbackFornoRollbackFor@Transactional 注解中的两个属性,用于定义哪些异常会导致事务回滚,哪些不会。

  • rollbackFor: 指定一组异常类,当方法抛出这些异常时,事务会回滚。
  • noRollbackFor: 指定一组异常类,当方法抛出这些异常时,事务不会回滚。

相关优势

  • 精确控制: 通过 rollbackFornoRollbackFor,开发者可以精确控制哪些异常会导致事务回滚,从而更好地适应业务需求。
  • 提高性能: 对于某些不需要回滚的异常(如业务异常),可以通过 noRollbackFor 避免不必要的回滚操作,从而提高系统性能。

类型

  • rollbackFor: 可以指定一个或多个异常类,如 rollbackFor = {SQLException.class, IOException.class}
  • noRollbackFor: 同样可以指定一个或多个异常类,如 noRollbackFor = {BusinessException.class}

应用场景

  • 金融系统: 在金融系统中,对于资金操作相关的异常,通常需要严格回滚事务以确保数据一致性。而对于一些业务异常(如用户输入错误),可能只需要提示用户而不需要回滚事务。
  • 电商系统: 在电商系统中,订单处理过程中可能会遇到各种异常情况。通过合理配置 rollbackFornoRollbackFor,可以确保在关键业务操作中保持数据一致性,同时避免因非关键异常导致的不必要回滚。

常见问题及解决方法

问题1: 为什么设置了 rollbackFor 但事务没有回滚?

  • 原因: 可能是因为抛出的异常没有被Spring事务管理器捕获。确保异常是从方法内部抛出,并且没有被try-catch块捕获。
  • 解决方法: 检查异常抛出和捕获逻辑,确保异常能够正确传播到事务管理器。

问题2: 如何处理嵌套事务中的回滚?

  • 原因: 在嵌套事务中,内部事务的回滚可能不会影响外部事务。这可能导致数据不一致。
  • 解决方法: 使用 PROPAGATION_REQUIRES_NEW 传播行为来创建独立的事务。这样,内部事务的回滚不会影响外部事务。

示例代码

代码语言:txt
复制
@Transactional(rollbackFor = {SQLException.class}, noRollbackFor = {BusinessException.class})
public void transfer(Account from, Account to, double amount) throws BusinessException {
    try {
        // 执行资金转移操作
    } catch (SQLException e) {
        // 数据库异常,事务回滚
        throw e;
    } catch (BusinessException e) {
        // 业务异常,事务不回滚
        throw e;
    }
}

参考链接

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • SpringBoot 实战 (十) | 声明式事务

    Spring 事务机制是用统一机制来处理不同数据访问技术事务处理,Spring 事务机制提供了一个 PlatformTransactionManager 接口,不同数据访问技术事务使用不同接口实现...被注解方法在被调用时,Spring 开启一个新事务,当方法无异常运行结束后,Spring 会提交这个事务。...(rollbackFor={SQLException.class}) rollbackForCalssName 一组异常类名,遇到回滚,类型 string[] noRollbackFor 一组异常类,...注解在类上时意味着此类所有 public 方法都是开启事务。如果类级别方法级别同时使用了 @Transactional 注解,则使用在类级别的注解会重载方法级别的注解。...SpringBoot 事务支持 自动配置事务管理器 在使用 JDBC 作为数据访问技术时,配置定义如下: @Bean @ConditionalOnMissingBean @ConditionalOnBean

    1.2K20

    阿里3面:Spring声明式事务连环炮,让我措手不及。。

    是通过aop方式对bean创建代理对象来实现事务管理 * 创建代理对象有2种方式,jdk动态代理cglib代理 * proxyTargetClass:true时候,就是强制使用cglib...extends Throwable>[] rollbackFor() default {}; /** * rollbackFor 作用一样,只是这个地方使用是类名 *...extends Throwable>[] noRollbackFor() default {}; /** * noRollbackFor 作用一样,只是这个地方使用是类名...同 rollbackFor,只是这个地方使用是类名 noRollbackFor 定义零(0)个或更多异常类,这些异常类必须是Throwable子类,当方法抛出这些异常时候,事务不会回滚 noRollbackForClassName...同 noRollbackFor,只是这个地方使用是类名 4、执行db业务操作 在@Transaction标注类或者目标方法上执行业务操作,此时这些方法会自动被spring进行事务管理。

    85620

    SpringBoot事务详解

    大家好,又见面了,我是你们朋友全栈君。 一、定义 事务(transaction)是指业务逻辑上对数据库进行一系列持久化操作,要么全部成功,要么全部失败。...2、事务实现 在Spring中,事务有两种实现方式,分别是编程式事务和声明式事务。...对于编程式事务,Spring推荐使用Transaction Template。...Spring建议是在具体实现类类方法使用@Transactional注解,而不是使用在接口上。因为注解不能继承,不能被基于接口代理类所识别,注解失效。...自动扫描 四、声明式事务常用配置 参 数 名 称 功 能 描 述 readOnly 该属性用于设置当前事务是否只读事务,设置true表示只读,false则表示可读写,默认值false。

    94920

    探究Spring事务:了解失效场景及应对策略

    在现代软件开发中,数据一致性完整性是至关重要。为了保证这些特性,Spring框架提供了强大事务管理机制,让开发者能够更加自信地处理数据库操作。...timeout:定义事务超时时间,超过该时间未提交则自动回滚。 rollbackFor noRollbackFor:指定在哪些异常情况下回滚事务或不回滚事务。...回滚策略: 默认情况下,Spring会将未捕获运行时异常(RuntimeException及其子类)作为触发事务回滚标志。你也可以通过rollbackFor属性指定哪些异常触发回滚。...TransactionSynchronizationManager是Spring一个工具类,用于管理监视事务状态。...事务我们提供了一个强大工具来维护数据一致性完整性。

    25060

    Spring注解之事务管理

    注解是Spring框架里很常用,本博文对Annotation事务管理进行说明,目的是编程学习者提供参考博客。...@Transactional放在一个类前面时,只是对public类型方法有用 若类中某些方法不需要事务管理时,通过@Transaction(propagation = Propagation.Not_SUPPORTED...,设置true表示只读,false则表示可读写,默认值false。...例如:@Transactional(readOnly=true) rollbackFor 该属性用于设置需要进行回滚异常类数组,当方法中抛出指定异常数组中异常时,则进行事务回滚。...事务隔离级别用于处理多事务并发情况,通常使用数据库默认隔离级别即可,基本不需要进行设置 timeout 该属性用于设置事务超时秒数,默认值-1表示永不超时

    70040

    Spring系列之Transactional事务管理

    注解是Spring框架里很常用,本博文对Annotation事务管理进行说明,目的是编程学习者提供参考博客。...@Transactional放在一个类前面时,只是对public类型方法有用 若类中某些方法不需要事务管理时,通过@Transaction(propagation = Propagation.Not_SUPPORTED...,设置true表示只读,false则表示可读写,默认值false。...例如:@Transactional(readOnly=true) rollbackFor 该属性用于设置需要进行回滚异常类数组,当方法中抛出指定异常数组中异常时,则进行事务回滚。...,事务隔离级别用于处理多事务并发情况,通常使用数据库默认隔离级别即可,基本不需要进行设置 timeout 该属性用于设置事务超时秒数,默认值-1表示永不超时

    21910

    Spring基础(十六):Spring事务管理注解方式XML配置方式

    Spring事务管理注解方式XML配置方式事务管理应该放在我们service层进行处理spring中有两种事务管理方式1、编程式事务管理(了解) 2、声明式事务管理(掌握)基于注解方式实现(...,readOnly = true,rollbackFor = ClassCastException.class,noRollbackFor = NullPointerException.class,timeout...它除了保证一个事务不能读取另一个事务未提交数据外,还保证了不可重复读。 5、SERIALIZABLE(串行化) 这是花费最高代价但是最可靠事务隔离级别,事务被处理顺序执行。...timeout 超时时间事务一定要在多长时间之内提交,如果不提交就会回滚readOnly 只读事务事务是否只能读取数据库数据,如果true,则不允许进行增删改rollbackFor 指定发生回滚异常当方法发生哪些异常时才会回滚...noRollbackFor 指定不发生回滚异常当方法发生哪些异常时,不会回滚二、XML配置方式applicationContext中,通过AOP实现事务控制<?

    44261

    Transaction 注解

    @Transaction 参考 Transaction事务属性 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)方法,注解失效原因和解决方法 Spring...-- 配置 Annotation 驱动,扫描@Transactional注解定义事务 --> <tx:annotation-driven transaction-manager="transactionManager...类名数组,必须继承自Throwable 不会导致事务回滚异常类名字数组 Spring 中 @Transactional 传播行为隔离级别 不同位置使用 标注在类前:表示类中所有方法都进行事务处理...REQUIRED 与 REQUIRED_NEW 解读 在上面的事务传播行为六种情况中,最难以理解,并且容易在transaction设计时出现问题是 REQUIRED REQURED_NEW 这两者区别...ServiceA就可以正常进行commit。 当然这里把ServiceAServiceB放在两个独立transaction是否成立,还需要再多多考虑你业务需求。

    79110

    Springboot事务处理

    Spring事务提供一个PlatformTransactionManager接口,不同数据访问技术使用不同接口实现。...,我们自动开启了声明式事务支持, 我们无需添加注解@EnableTransactionManagement Spring提供一个@EnableTransactionManagement注解在配置类上开启声明式事务支持..., 自动扫描加了@Transactional注解方法,加入事务支持。...rollbackFor 指定哪些异常可以导致事务回滚,默认是Throwable子类 noRollbackFor 执行哪些异常不可用引起事务回滚,默认是Throwable子类 2、springboot...及其子类) Error 进行回滚; 4、如果是其它异常,可以显形标记在参数里,下图标红就是先进行查看用户有指定异常,如果没有,就默认上一条异常,参数格式:@Transactional(rollbackFor

    79020

    Spring @Transactional事务管理

    事务定义 2. 事务四大特性 3. 事务管理方式 4....事务管理方式 Spring支持 编程式事务管理 声明式事务管理 两种方式。 编程式事务Spring推荐使用TransactionTemplate。 声明式事务管理建立在AOP之上 。...@Transactional不生效场景 用在非public方法 @Transactional是基于动态代理Spring代理工厂在启动时会扫描所有的类方法,并检查方法修饰符是否public...rollbackFor属性设置不对 Spring默认抛出RuntimeException 异常或Error时才会回滚事务,要想其他类型异常也回滚则需要设置rollbackFor属性值。...当作用于类上时,该类所有 public 方法将都具有该类型事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义

    40110

    Spring源码:事务管理流程分析

    背景 上一篇我们介绍了Spring事务案例:Spring事务管理:应用实战案例规则 事务Transaction,它是一系列严密操作动作,要么都操作完成,要么都回滚撤销。...rollbackFor():指定导致事务回滚异常类型,默认为运行时异常错误。 rollbackForClassName():通过异常类名指定导致事务回滚异常类型,默认为空。...从上面的函数中,我们尝试整理下事务处理脉络,在 Spring 中支持两种事务处理方式, 分别是声明式事务处理与编程式事务处理,两者相对于开发人员来讲差别很大,但是对于 Spring实现来讲,大同小异...总结 事务管理是其Spring框架核心功能之一,它提供了声明式事务管理编程式事务管理两种方式;Spring并不会直接管理事务,而是提供了事务管理器,通过AOP实现,主要步骤包括配置事务管理器、启用事务管理...、定义事务边界、创建事务代理、事务拦截器处理、事务同步管理事务资源管理。

    12820

    那些年你不能错过之【Spring事务】

    本文主要介绍 Spring 事务 如有需要,可以参考 如有帮助,不忘 点赞 ❥ 创作不易,白嫖无义! 概念 事务管理是企业级应用程序开发中必不可少技术, 用来确保数据完整性一致性。...注解来标注事务方法 根据 Spring AOP 基于代理机制,只能标注公有方法 可以在方法或者类级别上添加 @Transactional 注解,当把这个注解应用到类上时, 这个类中所有公共方法都会被定义成支持事务处理...例如:方法可能继续在现有事务中运行, 也可能开启一个新事务, 并在自己事务中运行。 事务传播行为可以由传播属性指定,Spring 定义了 7 种类传播行为。 ?...而受检查异常则不会 事务回滚规则可以通过 @Transactional 注解 rollbackFor noRollbackFor 属性来定义,这两个属性被声明为 Class[] 类型,因此可以为这两个属性指定多个异常类...遇到rollbackFor时必须进行回滚 ;而norollbackFor则反之 可以通过 @Transactional 配置,也可以在配置文件中配置 ?

    52440

    Transactional 可以作用于接口、接口方法、类以及类方法上

    --配置基于注解声明式事务 默认使用注解来管理事务行为--> <tx:annotation-driven transaction-manager="transactionManager...,默认取值REQUIRED,即使用调用方法事务 * REQUIRES_NEW:使用自己事务,调用事务方法事务被挂起。...* 3.默认情况下 Spring 声明式事务对所有的运行时异常进行回滚,也可以通过对应属性进行设置。通常情况下,默认值即可。 * 4.使用readOnly 指定事务是否只读。...当作用于类上时,该类所有 public 方法将都具有该类型事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。   ...另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 本质决定

    1.9K00

    Spring框架:第八章:声明式事务

    10、声明式事务 事务分为声明式编程式两种: 声明式事务:声明式事务是指通过注解形式对事务各种特性进行控制管理。 编码式(编程式)事务:指的是通过编码方式实现事务声明。...11.4、使用Spring注解声明事务管制 实验2:测试Spring声明式事务 1、在需要事务方法上加入注解。...noRollbackForClassName测试不回滚异常 实验3:noRollbackFornoRollbackForClassName测试不回滚异常 /** * @Transactional...实验5:rollbackForrollbackForClassName回滚异常 /** * @throws FileNotFoundException * @Transactional 表示当前方法有事务...例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己事务中运行。 事务传播行为可以由传播属性指定。Spring定义了7种类传播行为。

    33120
    领券