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

当方法标记为noRollbackFor引发异常时,@Transactional类中的UnexpectedRollbackException

是一个特殊的异常类。它表示在@Transactional注解的方法中,当指定的异常类型发生时,事务不会回滚,但是实际上发生了回滚。

在Spring框架中,事务管理是通过@Transactional注解来实现的。当一个方法被标记为@Transactional时,如果方法中抛出了异常,Spring会自动回滚事务,即撤销之前的数据库操作。然而,有时候我们希望在特定的异常发生时不回滚事务,这时就可以使用noRollbackFor属性。

noRollbackFor属性是@Transactional注解的一个属性,用于指定不回滚的异常类型。当方法中抛出指定的异常类型时,事务不会回滚。如果抛出的异常类型不在noRollbackFor属性中指定的列表中,事务会回滚。

而UnexpectedRollbackException是Spring框架中的一个异常类,它表示事务已经回滚,但是在方法中没有抛出任何异常。这种情况通常发生在方法标记了noRollbackFor属性,但是实际上发生了回滚的情况下。

对于UnexpectedRollbackException异常,可以通过检查日志或调试来确定具体的原因。可能的原因包括事务管理配置错误、异常处理不正确等。

总结起来,当方法标记为noRollbackFor引发异常时,@Transactional类中的UnexpectedRollbackException表示事务已经回滚,但是在方法中没有抛出任何异常。这种情况通常需要检查事务管理配置和异常处理,以确定具体的原因。

腾讯云相关产品和产品介绍链接地址:

  • 云数据库 TencentDB:https://cloud.tencent.com/product/tencentdb
  • 云服务器 CVM:https://cloud.tencent.com/product/cvm
  • 云原生应用引擎 TKE:https://cloud.tencent.com/product/tke
  • 云存储 COS:https://cloud.tencent.com/product/cos
  • 人工智能 AI:https://cloud.tencent.com/product/ai
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Transaction 注解

名数组,必须继承自Throwable 导致事务回滚异常名字数组 noRollbackFor Class对象数组,必须继承自Throwable 不会导致事务回滚异常数组 noRollbackForClassName...名数组,必须继承自Throwable 不会导致事务回滚异常名字数组 Spring @Transactional 传播行为和隔离级别 不同位置使用 标注在前:表示所有方法都进行事务处理...程序在某些情况下抛出异常,如果对于这两者不够了解,就可能很难发现而且解决问题。...ServiceB抛出了一个异常以后,ServiceB会把当前transaction标记为需要rollback。...原因是因为ServiceA调用ServiceB,serviceBdoSomething是在一个新transaction执行

77110

一口气说出 6种,@Transactional注解失效场景

@Transactional 可以作用在接口、方法。 作用于把@Transactional 注解放在,表示所有该类public方法都配置相同事务属性信息。...作用于方法配置了@Transactional方法也配置了@Transactional方法事务会覆盖事务配置信息。...( A a 方法用默认Propagation.REQUIRED模式,B b方法加上采用 Propagation.REQUIRES_NEW模式,然后在 a 方法调用 b方法操作数据库,然而...noRollbackFor属性** noRollbackFor:抛出指定异常类型,不回滚事务,也可以指定多个异常类型。...,导致@Transactional失效 开发避免不了会对同一个里面的方法调用,比如有一个Test,它一个方法A,A再调用本类方法B(不论方法B是用public还是private修饰),但方法A

1.5K10

SpringBoot 使用 @Transactional 注解配置事务

当作用于,该类所有 public 方法将都具有该类型事务属性,同时,我们也可以在方法级别使用该标注来覆盖级别的定义。...虽然 @Transactional 注解可以作用于接口、接口方法以及方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口代理它才会生效。...has been marked as rollback-only,因为ServiceB抛出了一个异常以后,ServiceB会把当前transaction标记为需要rollback。...这个属性可以实现: Aa方法加上默认注解@Transactional(propagation = Propagation.REQUIRED),Bb方法加上注解@Transactional(...2.不要图省事,将@Transactional放置在声明,放在声明,会使得所有方法都有事务。

7.5K20

spring(基础24) Spring注解@Transactional配置事务

虽然 @Transactional 注解可以作用于接口、接口方法以及方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口代理它才会生效。...5、@Transactional 注解属性介绍 value 和 transactionManager 属性 它们两个是一样意思。配置了多个事务管理器,可以使用该属性指定选择哪个事务管理器。...has been marked as rollback-only,因为ServiceB抛出了一个异常以后,ServiceB会把当前transaction标记为需要rollback。...这个属性可以实现: Aa方法加上默认注解@Transactional(propagation = Propagation.REQUIRED),Bb方法加上注解@Transactional(...2.不要图省事,将@Transactional放置在声明,放在声明,会使得所有方法都有事务。

67420

Spring事务管理 - `@Transactional`注解解析

@Transactional注解原理 @Transactional注解是Spring框架中用于声明事务性操作注解。它可以应用于方法级别或级别,并支持多种属性来定义事务行为。...一个方法被标记为@Transactional,Spring会在方法执行前开启一个事务,在方法执行后根据方法执行结果决定是提交事务还是回滚事务。...noRollbackFor: 指定哪些异常不触发事务回滚。 实际项目中应用 假设我们有一个电子商务平台,涉及用户账户余额交易。...最佳实践 在使用@Transactional注解,需要注意以下几个最佳实践: 方法划分: 将业务逻辑划分为适当事务性方法,避免一个方法过于庞大而引发事务问题。...异常处理: 在方法捕获并处理异常,或者使用rollbackFor和noRollbackFor属性明确指定哪些异常触发事务回滚。

42710

关于Spring事务管理 之 默认事务间调用问题

事务概念略; 由事务传播行为我们知道, 如果将方法配置为默认事务(REQUIRED)在执行过程Spring会为其新启事务(REQUIRES_NEW), 作为一个独立事务来执行....logger.error("业务2处理异常,{}", e.getMessage()); } 问题原因是因为两个service方法doService均为默认事务(REQUIRED),...又由于spring事务回滚依托在异常之上, demoService2.doService()出现异常后它将事务标记为回滚....异常抛出后被catch , demoService1.doService 没有接受到里面抛出异常, 方法继续执行, 执行结束后, 事务提交....但demoService1在做commit时候检测到事务被标记为回滚, 与预期不符, 也就是Unexpected 意想不到 UnexpectedRollbackException: Transaction

81730

Spring,多个service发生嵌套,事务是怎么样

根据报错信息来看是spring框架事务管理报错:事务回滚了,因为它被标记为回滚状态。...报错原因 多层嵌套事务,如果使用了默认事务传播方式,内层事务抛出异常,外层事务捕捉并正常执行完毕,就会报出rollback-only异常。...spring框架是使用AOP方式来管理事务,如果一个被事务管理方法正常执行完毕,方法结束spring会将方法sql进行提交。如果方法执行过程中出现异常,则回滚。...如果内层事务抛出异常e,在内层事务结束,spring会把事务标记为“rollback-only”。...这时如果外层事务捕捉了异常e,那么外层事务方法还会继续执行代码,直到外层事务也结束,spring发现事务已经被标记为“rollback-only”,但方法却正常执行完毕了,这时spring就会抛出“org.springframework.transaction.UnexpectedRollbackException

9.2K30

Spring,多个service发生嵌套,事务是怎么样

根据报错信息来看是spring框架事务管理报错:事务回滚了,因为它被标记为回滚状态。...报错原因 多层嵌套事务,如果使用了默认事务传播方式,内层事务抛出异常,外层事务捕捉并正常执行完毕,就会报出rollback-only异常。...spring框架是使用AOP方式来管理事务,如果一个被事务管理方法正常执行完毕,方法结束spring会将方法sql进行提交。如果方法执行过程中出现异常,则回滚。...如果内层事务抛出异常e,在内层事务结束,spring会把事务标记为“rollback-only”。...这时如果外层事务捕捉了异常e,那么外层事务方法还会继续执行代码,直到外层事务也结束,spring发现事务已经被标记为“rollback-only”,但方法却正常执行完毕了,这时spring就会抛出“org.springframework.transaction.UnexpectedRollbackException

97810

Spring注解之事务管理

@Transactional放在一个前面,只是对public类型方法有用 若某些方法不需要事务管理,通过@Transaction(propagation = Propagation.Not_SUPPORTED...例如:@Transactional(readOnly=true) rollbackFor 该属性用于设置需要进行回滚异常数组,方法抛出指定异常数组异常,则进行事务回滚。..., Exception.class})  续表) 参 数 名 称 功 能 描 述 rollbackForClassName 该属性用于设置需要进行回滚异常名称数组,方法抛出指定异常名称数组异常...={"RuntimeException","Exception"}) noRollbackFor 该属性用于设置不需要进行回滚异常数组,方法抛出指定异常数组异常,不进行事务回滚。...RuntimeException.class, Exception.class}) noRollbackForClassName 该属性用于设置不需要进行回滚异常名称数组,方法抛出指定异常名称数组异常

68740

Spring系列之Transactional事务管理

@Transactional放在一个前面,只是对public类型方法有用 若某些方法不需要事务管理,通过@Transaction(propagation = Propagation.Not_SUPPORTED...例如:@Transactional(readOnly=true) rollbackFor 该属性用于设置需要进行回滚异常数组,方法抛出指定异常数组异常,则进行事务回滚。...,方法抛出指定异常名称数组异常,则进行事务回滚。...={"RuntimeException","Exception"}) noRollbackFor 该属性用于设置不需要进行回滚异常数组,方法抛出指定异常数组异常,不进行事务回滚。...={RuntimeException.class, Exception.class}) noRollbackForClassName 该属性用于设置不需要进行回滚异常名称数组,方法抛出指定异常名称数组异常

21010

聊聊springUnexpectedRollbackException

序 本文主要研究一下springUnexpectedRollbackException UnexpectedRollbackException /** * Thrown when an attempt...,一般是事务嵌套,内层事务抛出了异常,外层事务给catch住了,然后试图提交事务报错 示例 @Transactional public Customer createWithCatch(...方法在执行invocation.proceedWithInvocation()时会catch住异常,然后执行completeTransactionAfterThrowing completeTransactionAfterThrowing...);这里是status.isGlobalRollbackOnly()被标记为true了,因而unexpectedRollback为true 小结 UnexpectedRollbackException继承了...TransactionException,一般是事务嵌套,内层事务抛出了异常,外层事务给catch住了,然后试图提交事务报错UnexpectedRollbackException(Transaction

22810

Spring @Transactional事务管理

因此数据库只包含成功事务提交结果,就说数据库处于一致性状态。...- rollbackFor 设置需要进行回滚异常方法抛出指定异常,则进行事务回滚。...={“RuntimeException”,“Exception”}) - noRollbackFor 设置哪些异常类型 不能 导致事务回滚,方法抛出指定异常名称数组异常,不进行事务回滚。...指定单一异常:@Transactional(noRollbackFor=RuntimeException.class) 指定多个异常:@Transactional(noRollbackFor={RuntimeException.class...同一个,非@Transactional方法调用@Transactional方法 还是动态代理原因,内部方法调用是通过this调用,不会使用动态代理对象,事务不会回滚。

37010

【面试】Spring事务面试考点吐血整理(建议珍藏)

noRollbackFor/noRollbackForClassName属性,可以配置不导致回滚异常类型,遇到这样未处理异常,照样提交相关事务。...事务注解在/方法上 @Transactional注解既可以标注在上,也可以标注在方法上。当在,默认应用到所有方法。如果此时方法上也标注了,则方法优先级高。...事务注解在继承性 @Transactional注解作用可以传播到子类,即如果父了子类就不用了。但倒过来就不行了。 子类了,并不会传到父,所以父方法不会有事务。...Spring团队建议注解标注在上而非接口上。 只在public方法上生效? 采用代理来实现事务,(注意是代理),@Transactional注解只能应用在public方法上。...标记在protected、private、package-visible方法,不会产生错误,但也不会表现出为它指定事务配置。可以认为它作为一个普通方法参与到一个public方法事务

58530

Springboot事务处理

, 自动扫描加了@Transactional注解方法,加入事务支持。...Transactional注解几个属性 propagation 事务传播机制,主要有以下几种,默认是REQUIRED: REQUIRED – 方法A调用时候没有事务新建一个事务,在方法A调用方法B...REQUIRES_NEW – 方法A调用方法B,无论是否存在事务都开启一个新事务,这样B方法异常不会导致A数据回滚。...强制方法不在事务执行,若有事务,在方法调用到结束阶段先挂起事务。...事务使用 Spring boot是默认启动事务,只需要在或者方法上添加@Transactional注解即可,但有时候会发现事务不生效,具体原因可以从以下几个方面找寻: 1、首先要看数据库引擎是否支持注解

76820

【面试】Spring事务面试考点整理

noRollbackFor/noRollbackForClassName属性,可以配置不导致回滚异常类型,遇到这样未处理异常,照样提交相关事务。...事务注解在/方法上 @Transactional注解既可以标注在上,也可以标注在方法上。当在,默认应用到所有方法。如果此时方法上也标注了,则方法优先级高。...事务注解在继承性 @Transactional注解作用可以传播到子类,即如果父了子类就不用了。但倒过来就不行了。 子类了,并不会传到父,所以父方法不会有事务。...Spring团队建议注解标注在上而非接口上。 只在public方法上生效? 采用代理来实现事务,(注意是代理),@Transactional注解只能应用在public方法上。...标记在protected、private、package-visible方法,不会产生错误,但也不会表现出为它指定事务配置。可以认为它作为一个普通方法参与到一个public方法事务

1.2K20

聊聊springUnexpectedRollbackException

,一般是事务嵌套,内层事务抛出了异常,外层事务给catch住了,然后试图提交事务报错示例 @Transactional public Customer createWithCatch(String...给catch住了,最后提交事务则报UnexpectedRollbackException异常源码解析invokeWithinTransactionorg/springframework/transaction...方法在执行invocation.proceedWithInvocation()时会catch住异常,然后执行completeTransactionAfterThrowingcompleteTransactionAfterThrowingorg...);这里是status.isGlobalRollbackOnly()被标记为true了,因而unexpectedRollback为true小结UnexpectedRollbackException继承了...TransactionException,一般是事务嵌套,内层事务抛出了异常,外层事务给catch住了,然后试图提交事务报错UnexpectedRollbackException(Transaction

26110

面试题78:什么时候@Transaction失效?

@Transactional 应用在非public修饰方法上 如果在protected、private 修饰方法上使用 @Transactional 注解,虽然事务无效,但不会有任何报错,这是我们很容犯错一点...如果在事务抛出其他类型异常,但却期望 Spring 能够回滚事务,就需要指定rollbackFor属性。...---- 同一个方法调用,导致@Transactional失效 开发避免不了会对同一个里面的方法调用,比如有一个Test,它一个方法A去调用本类方法B(不论方法B是用public还是private...回答:其实这还是由于使用Spring AOP代理造成,因为只有当事务方法被当前以外代码调用时,才会由Spring生成代理对象来管理。...因为ServiceB抛出了一个异常以后,ServiceB标识当前事务需要rollback。

16540

【小家java】Spring事务嵌套引发血案---Transaction rolled back because it has been marked as rollback-only

,将会使事务管理变得异常简单,比如如下方法就有事务: @Transactional @Override public boolean create(User user) { int i =...这个时候把参数unexpectedRollback置为false了,所以create事务需要回滚时候,如下: ? 所以,就之前抛出异常了,这个解释很合理了吧。...如果isGlobalRollbackOnParticipationFailure为false,则会让主事务决定回滚,如果遇到exception加入事务失败,调用者能继续在事务内决定是回滚还是继续。...然而,要注意是那样做仅仅适用于在数据访问失败情况下且只要所有操作事务能提交 Tips: Spring aop 异常捕获原理:被拦截方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法异常...()也成)这样程序异常才能被aop捕获进而回滚。

8.6K10

Spring事务回滚和提交你真的明白了吗,本篇文章带你走近源码。干货满满

protected void completeTransactionAfterThrowing(@Nullable TransactionInfo txInfo, Throwable ex) { // 抛出异常... rollbackToSavepoint 方法。...** 事务提交 在事务执行没有出现任何异常,也就意味着事务可以走正常事务提交流程,这里回到流程,看看TransactionAspectSupportcommitTransactionAfterReturning...,回滚时候,并不执行回滚,只是标记一下回滚状态,外层事务提交时候,会先判断ConnectionHolder回滚状态,如果已经标记为回滚,则不会提交,而是外层事务进行回滚。...函数,在这个函数里面可以看到是无论是在异常还是没有异常流程,最后finally代码块都会执行这个cleanupAfterCompletion(status);方法 看源码(AbstractPlatformTransactionManager.java

87010
领券