首页
学习
活动
专区
圈层
工具
发布

捕获异常抛出事务不回滚

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

1.6K30

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

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

91810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

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

    26820

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

    方法用final修饰 未被spring管理 多线程调用 表不支持事务 未开启事务 事务不回滚 错误的传播特性 自己吞了异常 手动抛了别的异常 自定义了回滚异常 嵌套事务回滚多了 其他常见问题 编程式事务...---- 事务不回滚 错误的传播特性 在使用@Transactional注解时,是可以指定propagation参数的。...---- 自定义了回滚异常 在使用@Transactional注解声明事务时,有时我们想自定义回滚的异常,spring也是支持的。可以通过设置rollbackFor参数,来完成这个功能。...,原本是希望调用roleService.doOtherThing方法时,如果出现了异常,只回滚doOtherThing方法里的内容,不回滚 userMapper.insertUser里的内容,即回滚保存点...能够更小粒度的控制事务的范围,更直观。 ---- 大事务问题 在使用spring事务时,有个让人非常头疼的问题,就是大事务问题。

    1.7K10

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

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

    2.8K50

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

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

    98710

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

    更多Spring事务问题请访问链接:Spring事务回滚疑难详解 一,为什么框架中根本没有对Exception的一般子类进行回滚配置,异常发生时,事务都进行了回滚 ,说好的只会对RuntimeException...受检异常(Checked)一般在编译期就被检出,这就给你造成了一个Spring对于所有异常都会发生回滚的误解。...下面给出一些受检CHECKED异常: 二,为什么我在执行方法的时候出现了SQL执行的Exception,默认配置的情况下,事务还是发生了回滚 ?...② 实际上,当我们在项目开发中加入了Spring框架以后,SQL异常都被org.springframework重写,正如上面的重复主键的SQL异 常。...RuntimeException的子类 得出结论:Spring框架下,所有SQL异常都被org.springframework重写为RuntimeException,事务因此也会发生回滚!

    1.3K40

    中高级程序员可能都不会使用spring-boot-starter-jdbc访问MySQL

    因为在Spring Boot 2.X中,spring-boot-starter-jdbc 默 认 引 入 HikariCP 依 赖 。...6.事务的支持 Spring Boot中Maven依赖中添加了spring-boot-starter-jdbc依赖,就是可以实现对事务的支持,只需要在Dao业务层添加事务注解@Transactional...在 默 认 情 况 下 ,Spring框架只在抛出运行时和不可检查异常时才会对事务回滚。...● 如果你想让checked异常也回滚,注解方式如下: ● 如果你想让unchecked异常也不回滚,注解方式如下: ● 不需要事务管理的方法如下: 另外,如果你在业务方法中使用了try{}catch...{},当出现数据异常时,事务就不回滚了,所以如果想要回滚异常事务,必须要主动将异常抛出来。

    57220

    1.非 public 方法解决方案

    在 Spring Boot 中,造成事务不自动回滚的场景有很多,比如以下这些: 非 public 修饰的方法中的事务不自动回滚; 当 @Transactional 遇上 try/catch 事务不自动回滚...1.非 public 方法解决方案 非 public 方法中事务不回滚的直接原因是,在非 public 方法上添加的 @Transactional 关键字是无效的,也就是此方法本身是以非事务的方式运行的...此问题的解决方案有两种:一种是在 catch 中将异常重新抛出去,另一种是使用代码手动将事务回滚。...,如下图所示: 检查异常不回滚事务的原因是因为,@Transactional 默认只回滚运行时异常 RuntimeException 和 Error,而对于检查异常默认是不回滚的。...: 在新建表时设置数据库引擎: 在修改表时设置数据库引擎: PS:也就是数据库的引擎是和表直接相关的,我们只需要正确的设置引擎之后,事务就可以正常的执行了。

    76610

    Spring Boot 事务管理进阶

    是否在多数据源环境下为事务管理头疼不已? Spring Boot 虽然通过自动配置简化了 Spring 的事务管理, 但其背后的 AOP 代理机制、传播行为、隔离级别、回滚规则 仍充满陷阱。...文末附事务传播行为决策图与面试高频问题清单,助你彻底掌握 Spring 事务。一、Spring Boot 事务:从自动配置说起Spring Boot 的便捷性体现在自动配置上。...当你引入 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 时,Spring Boot 会自动配置一个 PlatformTransactionManager...、独立操作SUPPORTS有则加入,无则非事务查询方法MANDATORY必须有事务,否则异常内部方法要求事务上下文NEVER必须无事务,否则异常避免在事务中执行特定操作NOT_SUPPORTED挂起当前事务...合理配置传播行为、隔离级别、回滚规则。多数据源需明确指定 TransactionManager。分布式事务需引入专门框架。掌握这些知识,你才能写出高可靠、高性能的 Spring Boot 应用。

    15310

    中高级程序员可能都不会使用spring-boot-starter-jdbc访问MySQL

    因为在Spring Boot 2.X中,spring-boot-starter-jdbc 默 认 引 入 HikariCP 依 赖 。...◆6.事务的支持 Spring Boot中Maven依赖中添加了spring-boot-starter-jdbc依赖,就是可以实现对事务的支持,只需要在Dao业务层添加事务注解@Transactional...在 默 认 情 况 下 ,Spring框架只在抛出运行时和不可检查异常时才会对事务回滚。...● 如果你想让checked异常也回滚,注解方式如下: ● 如果你想让unchecked异常也不回滚,注解方式如下: ● 不需要事务管理的方法如下: 另外,如果你在业务方法中使用了try{}catch...{},当出现数据异常时,事务就不回滚了,所以如果想要回滚异常事务,必须要主动将异常抛出来。

    1.3K10

    Spring Boot 事务管理入门

    这些问题的背后,往往是事务管理不当导致的数据不一致。 在 Spring Boot 应用中,@Transactional 注解看似简单,实则暗藏玄机。...二、Spring Boot 事务管理全景图Spring Boot 提供了两种事务管理方式,适用于不同场景:方式适用场景控制粒度推荐度声明式事务 (@Transactional)绝大多数业务方法方法级⭐⭐...其他关键属性属性说明示例rollbackFor指定回滚的异常@Transactional(rollbackFor = Exception.class)noRollbackFor指定不回滚的异常@Transactional...❌ 场景 7:rollbackFor 配置错误@Transactional(noRollbackFor = Exception.class) // ❌ 任何异常都不回滚!...答:Spring 通过 AOP 在方法执行前开启事务(获取 Connection)同一个事务内的操作使用同一个 Connection方法成功则 commit(),异常则 rollback()数据库的 undo

    15810

    SpringBoot 快速开启事务(附常见坑点)「建议收藏」

    序言:此前,我们主要通过XML配置Spring来托管事务。在SpringBoot则非常简单,只需在业务层添加事务注解(@Transactional )即可快速开启事务。...常见坑点 使用事务注解@Transactional 之前,应该先了解它的相关属性,避免在实际项目中踩中各种各样的坑点。 常见坑点1:遇到检测异常时,事务默认不回滚。....."); } 原因分析:因为Spring的默认的事务规则是遇到运行异常(RuntimeException及其子类)和程序错误(Error)才会进行事务回滚,显然SQLException并不属于这个范围...如果想针对检测异常进行事务回滚,可以在@Transactional 注解里使用 rollbackFor 属性明确指定异常。...这是许多新手都会犯的一个错误,在业务层手工捕捉并处理了异常,你都把异常“吃”掉了,Spring自然不知道这里有错,更不会主动去回滚数据。例如:下面这段代码直接导致增加余额的事务回滚没有生效。

    1.7K20

    使用Transactional 注解实现数据一致性 SpringBoot事务管理

    在Spring Boot中,可以使用@Transactional注解来管理事务的边界。...当一个方法被标记为@Transactional时,Spring Boot会在方法开始时创建一个事务,并在方法执行完成后根据执行结果决定是提交事务还是回滚事务。...如果为只读操作,数据库引擎可以对事务进行一些优化,提高性能。 rollbackFor 和 noRollbackFor:用于指定事务在遇到指定异常时是否回滚或不回滚。...在调用该方法时,如果方法执行成功,则事务将被提交;如果方法执行失败,则事务将被回滚。...如果在业务操作中发生异常,事务可以自动回滚,保证数据的一致性。例如,在一个订单支付的操作中,如果支付过程中发生异常,可以通过事务回滚来取消订单并恢复库存。

    96310
    领券