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

Spring事务在异常后不回滚

是因为在默认情况下,Spring只会在遇到未检查异常(RuntimeException及其子类)时才会回滚事务,而对于已检查异常(Exception及其子类)则不会回滚事务。

这种行为是为了避免误回滚,因为已检查异常通常是可以被捕获和处理的,而未检查异常通常是由于程序错误或系统故障引起的,需要回滚事务来保证数据的一致性。

如果希望在遇到已检查异常时也回滚事务,可以通过在事务注解上添加rollbackFor属性来指定需要回滚的异常类型,例如:

代码语言:txt
复制
@Transactional(rollbackFor = Exception.class)
public void someMethod() {
    // 业务逻辑代码
}

这样,当someMethod方法中抛出任何异常时,都会触发事务回滚。

另外,Spring还提供了noRollbackFor属性,用于指定不需要回滚的异常类型,例如:

代码语言:txt
复制
@Transactional(noRollbackFor = BusinessException.class)
public void someMethod() {
    // 业务逻辑代码
}

这样,当someMethod方法中抛出BusinessException异常时,事务不会回滚。

总结起来,Spring事务在异常后不回滚的原因是默认只回滚未检查异常,可以通过rollbackFor属性来指定需要回滚的异常类型,或使用noRollbackFor属性来指定不需要回滚的异常类型。

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

相关·内容

捕获异常抛出事务不回

方法名上加注解事务 @Transactional 使用注解的简单模式,报错会回,但是如果方法中捕获异常后手动抛出异常事务并没有回。...默认spring事务发生未被捕获的 RuntimeException 时才回。...spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回,默认情况下aop只捕获 RuntimeException 的异常,但可以通过配置来捕获特定的异常并回...catch中抛出异常时抛出异常类型为 RuntimeException ,经测试 Exception 确实不可以回。 2....如果catch中有其他需要不可以抛出 RuntimeException ,可以手动回事务: TransactionAspectSupport.currentTransactionStatus().setRollbackOnly

1.5K30

面试遇到Spring双层事务不回怎么破?

最近有粉丝朋友圈问我,面试遇到了Spring事务不会问题,怎么破解。本文结合一个简单案例,希望能解决一部分人的疑惑。...纳闷了一会儿,看到双层事务,就想起了 Spring事务传播机制,前边理解得比较肤浅。 没有特殊的配置,自然是走默认的事务传播机制了,也就是 Propagation.REQUIRED。...7、PROPAGATION_NESTED 开始执行事务前,先保存一个savepoint,当发生异常时,就回滚到savepoint;没有异常时,跟着外部事务一起提交或回。...3、事务提交时,进行事务状态的判断,就发现这个事务是失败的,需要回,所以抛出了 Transaction silently rolled back because it has been marked...点击阅读原文,免费的 Spring5 视频教程让你彻底搞懂她!

81810
  • 面试遇到Spring双层事务不回怎么破

    最近有粉丝朋友圈问我,面试遇到了Spring事务不会问题,怎么破解。本文结合一个简单案例,希望能解决一部分人的疑惑。...纳闷了一会儿,看到双层事务,就想起了 Spring事务传播机制,前边理解得比较肤浅。 没有特殊的配置,自然是走默认的事务传播机制了,也就是 Propagation.REQUIRED。...6、PROPAGATION_NEVER 以非事务方式运行,如果存在事务,就抛出异常。...7、PROPAGATION_NESTED 开始执行事务前,先保存一个savepoint,当发生异常时,就回滚到savepoint;没有异常时,跟着外部事务一起提交或回。...3、事务提交时,进行事务状态的判断,就发现这个事务是失败的,需要回,所以抛出了 Transaction silently rolled back because it has been marked

    22720

    每日一博 - 常见的Spring事务失效&事务不回案例集锦

    方法用final修饰 未被spring管理 多线程调用 表不支持事务 未开启事务 事务不回 错误的传播特性 自己吞了异常 手动抛了别的异常 自定义了回异常 嵌套事务多了 其他常见问题 编程式事务...---- 事务不回 错误的传播特性 使用@Transactional注解时,是可以指定propagation参数的。...如果想要spring事务能够正常回,必须抛出它能够处理的异常。如果没有抛异常,则spring认为程序是正常的。...---- 手动抛了别的异常 即使开发者没有手动捕获异常,但如果抛的异常不正确,spring事务也不会回。...---- 自定义了回异常 使用@Transactional注解声明事务时,有时我们想自定义回异常spring也是支持的。可以通过设置rollbackFor参数,来完成这个功能。

    1.4K10

    主线程和子线程下的事务不回spring

    ,子线程抛异常了,按道理来讲,不会给用户返回刷入失败的奖品,这样一般情况下能想到的就是整个事务会回,然后让用户再抽一次,那么问题就来了?...子线程抛异常了主线程能回吗?...答案是不能,因为主线程拿不到子线程抛的异常信息,spring事务管理的是当前线程下的,并且事务的隔离级别默认是 PROPAGATION_REQUIRED--支持当前事务,假设当前没有事务。...就新建一个事务,这涉及到ThreadLocal以及线程私有栈的概念,如果Spring 事务使用InhertableThreadLocal就可以把连接传到子线程,但是为什么Spring不那么干呢?...因为这样毫无意义,如果把同一个连接传到子线程,那就是SQL操作会串行执行,那何必还多线程呢,很显然,另外一个线程下自然会创建一个新的事物,而不是进行事务传播,所以不能够回业务 这个时候,我想到了这个类

    2.7K50

    Spring事务异常需要数据库引擎支持

    Exception e) { } 例:一个方法报异常,另一个方法回 catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回,并且service...事务的管理,因为没有任何异常会从业务方法中抛出,全被捕获并“吞掉”,导致spring异常抛出触发事务策略失效。...如果在catch代码块中采用页面硬编码的方式使用spring api对事务做显式的回,这样写也是可以的。...Error是一种unchecked Exception,编译器不会检查Error是否被处理,程序中不用捕获Error类型的异常。一般情况下,程序中也不应该抛出Error类型的异常。...rollbackFor定义的是需要回异常,noRollbackFor定义的是不需要回异常

    92710

    java 配置事务_Spring@Transactional事务

    Spring事务分为编程时事务和声明式事务,编程式事务:编程人员通过代码控制事务的开启、回、提交,声明式事务:把事务的处理交给spring。...3.默认情况下,spring会对unchecked异常进行事务;如果是checked异常不回。...将方法中出现的异常抛出给spring事务 (3)去掉方法体中的try catch (4)catch (Exception e) { throw e;}继续向上抛,目的是让spring事务捕获这个异常 除了以上注意的问题...,说一下最近遇到的关于多数据源配置事务的问题 项目中关于事务该配置的也配置了,需要注意的问题也注意了,但有的事务可以出现回有的回失败,最终问题所在: id相同的事务配置分别配置两个application.xml...文件中,如果多个application.xml有配置,web.xml中加载的application.xml中的事务配置会覆盖最先加的application.xml中的事务配置。

    2.3K20

    哪些异常是RuntimeException?Sql异常属于RuntimeException吗?Spring下SQL异常事务

    更多Spring事务问题请访问链接:Spring事务疑难详解 一,为什么框架中根本没有对Exception的一般子类进行回配置,异常发生时,事务都进行了回 ,说好的只会对RuntimeException...受检异常(Checked)一般在编译期就被检出,这就给你造成了一个Spring对于所有异常都会发生回的误解。...下面给出一些受检CHECKED异常: 二,为什么我执行方法的时候出现了SQL执行的Exception,默认配置的情况下,事务还是发生了回 ?...程序运行,Consumption消费记录并没有出现第二条: 所以此时,该事务发生了回。...RuntimeException的子类 得出结论:Spring框架下,所有SQL异常都被org.springframework重写为RuntimeException,事务因此也会发生回

    1.1K40

    Spring 事务提交回源码解析

    本文首发于个人公众号 Java 技术大杂烩,欢迎关注 前言 在上篇文章 Spring 事务初始化源码分析 中分析了 Spring 事务初始化的一个过程,当初始化完成Spring 是如何去获取事务...,当目标方法异常,又是如何进行回的,又或是目标方法执行成功,又是怎么提交的呢?...此外,事务的提交和回由底层数据库进行控制,而 Spring 事务行为可以传播,这个传播方式由 Spring 来进行控制,它是怎么控制的呢?这篇文章就来分析下 Spring 事务提交回的源码。...TransactionInterceptor 还记得 Spring 事务初始化源码分析 中注册了一个 bean,名字为 TransactionInterceptor 吗?...,需要设置事务的一些信息,比如隔离级别,timeout 等,这些功能不是由 Spring 来控制,而是由底层的数据库来控制的,数据库连接的设置是 doBegin 方法中进行处理: protected

    1.4K11

    MYSQL 由一个锁问题,带出MYSQL事务错误不回的问题

    到此出现错误的信息的原因大概是弄清了, 其实到这里我们今天的主题才刚刚开始,问题是如果在 update 语句之前事务中还有其他的udpate语句, 到底是回不回。 ?...答案是: 不 不 不回 我们看一下是不是这样: 1 session 1 begin; 2 session 1 update a set name = 'aaa' where name >...答案:不出所料,如果你的失败的事务上面有其他的DML语句,一定会被执行 ?...这就和SQL SERVER 默认的事务执行的方式一样, 如果事务错误,则上面执行的就不回 OMG, 我想着绝对和开发人员想的不大一样。...他的功能是,自动回不会发生InnoDB锁等待超时错误。并且这个参数需要关闭MYSQL 配置文件中配置,重启动生效。 session 2 ? session 1 ?

    93630

    Try-Catch包裹的代码异常,竟然导致了产线事务

    导读:一段被try-catch包裹的代码产线稳定运行了200天忽然发生了异常,而这个异常竟然导致了产线事务。这期间究竟发生了什么?日常在项目过程中该如何避免事务异常?...而造成事务的,竟然是一段被try-cath包裹的代码,一段已经产线稳定运行了200天的代码,稳定到我们已经把它遗忘了。...当他告诉我一段try-catch的代码造成产线事务,我温柔、耐心地对他说:“一边去,没看我正忙着吗?”,然后他给我甩出了一段代码,用猥琐又真诚的眼睛告诉我,他说的是真的。...; try { orderService.methodB(); } catch (Exception e) { // order失败了不能影响该方法,不回...Spring捕获异常,正如我们所猜测的,事务将会被设置全局rollback,而最外层的事务方法执行commit操作,这时由于事务状态为rollback,Spring认为不应该commit提交事务,而应该回事务

    1.4K20

    Spring嵌套事务是怎么回的?

    事务的传播机制 多数据源的切换问题 更深入理解 Spring 事务。 用户注册完成,需要给该用户登记一门PUA必修课,并更新该门课的登记用户数。 为此,我添加了两个表。...期待结果是即便内部事务regCourse()发生异常,外部事务saveStudent()俘获该异常,内部事务应自行回,不影响外部事务。 这是什么原因造成的呢?... regCourse()中抛异常,并触发回操作时,这个回会继续传播,从而把 saveUser() 也回,最终整个事务都被回!...修正 Spring事务默认传播属性 REQUIRED,整个事务的调用链上,任一环节抛异常都会导致全局回。...这意味着此时Spring 只对注册课程这部分的数据进行了回,并没有传播到外层: 当子事务声明为 Propagation.REQUIRES_NEW 时, TransactionAspectSupport.invokeWithinTransaction

    1.4K50

    Spring事务的两种方法

    当然,Spring事务的前提是你当前使用的数据库必须支持事务,比如MySQL的Innodb是支持的,但Mysaim则是不支持事务的。...方法一 使用 @Transaction 来配置自动回,可以配置类上,也可以配置方法上(作用域不同),但对final或private修饰的方法无效,且该类必须是受spring所管控的,也就是被已经被注入的类...,则事务会被自动回,除非你该方法中手动捕获了异常,且没有抛出新的异常。...可以使用 @Transactional(rollbackFor = Exception.class) 来设定针对特定的异常进行事务,如果不设置则默认会回 RuntimeException and...} } 复制代码 方法二 通过注入 DataSourceTransactionManager 来手动开启事务,手动回事务,用于抛出异常被catch,进行手动回,可控程度更高,可以更灵活的使用。

    1.1K10

    Spring中@Transactional事务实例及源码

    Spring中@Transactional事务实例及源码 一、使用场景举例 了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用。...但是执行的时候可能会出现这种情况,我们先删除部门,再删除成员,但是部门删除成功了,删除成员的时候出异常了。这时候我们希望如果成员删除失败了,之前删除的部门也取消删除。...这种场景就可以使用@Transactional事物回。...二、checked异常和unchecked异常 这里之所以让大家清楚checked异常和unchecked异常概念,是因为: Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了...Spring团队建议具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。

    1.7K90

    spring事务的多种方式「建议收藏」

    注解事务:直接在Service层的方法上面加上@Transactional注解,个人比较喜欢用这种方式。 2.事务不回的原因 在工作中,看过别人写的代码出现了事务不回的现象。...当然,事务不回的都是采用的声明式事务或者是注解事务;编程式事务都是自己写代码手动回的,因此是不会出现不回的现象。...再说下声明式事务和注解事务的原理:当被切面切中或者是加了注解的方法中抛出了RuntimeException异常时,Spring会进行事务。...,没有手动抛出RuntimeException异常 (3)Service方法中,抛出的异常不属于运行时异常(如IO异常),因为Spring默认情况下是捕获到运行时异常就回 3.如何保证事务...().setRollbackOnly(); )来实现回,这样的话,就可以异常也能return 返回值;比较适合需要拿到Service层的返回值的场景。

    2K40
    领券