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

SpringBoot @Transactional在异常后不刷新会话

SpringBoot @Transactional是一个注解,用于在方法上标记事务的边界。当方法被调用时,Spring会自动为该方法创建一个事务,并在方法执行结束后根据方法的执行结果决定是提交事务还是回滚事务。

在默认情况下,当方法抛出未捕获的异常时,Spring会将事务标记为回滚,并将异常向上抛出。这意味着事务中的所有数据库操作都将被回滚,包括之前已经提交的操作。

然而,@Transactional注解默认只捕获RuntimeException及其子类的异常,并将其作为触发事务回滚的标志。如果方法抛出的是Checked Exception(非RuntimeException的异常),则默认情况下事务不会回滚。

如果希望在方法抛出任何异常时都回滚事务,可以使用@Transactional注解的rollbackFor属性,指定需要回滚的异常类型。例如,@Transactional(rollbackFor = Exception.class)将会在方法抛出任何异常时都回滚事务。

关于不刷新会话的问题,@Transactional注解默认情况下会在事务结束时刷新会话。会话刷新是指将所有未提交的数据库操作同步到数据库中。如果在事务结束时发生异常,并且异常被捕获并处理了,那么事务将不会回滚,也不会刷新会话。

如果希望在异常发生后仍然刷新会话,可以在@Transactional注解上添加属性:@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)。其中,propagation属性指定了事务的传播行为,REQUIRES_NEW表示每次方法调用都会创建一个新的事务,并在方法结束时刷新会话。

总结起来,SpringBoot @Transactional注解用于标记方法的事务边界,可以控制事务的提交和回滚。默认情况下,方法抛出RuntimeException及其子类的异常会触发事务回滚,而Checked Exception不会触发回滚。可以通过rollbackFor属性指定需要回滚的异常类型。默认情况下,事务结束时会刷新会话,但如果异常被捕获并处理了,事务将不会回滚也不会刷新会话。如果希望在异常后仍然刷新会话,可以使用propagation属性设置为REQUIRES_NEW。

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

相关·内容

事务、异步线程池、二级缓存

springboot默认的提交策略是自动提交的,也就是一句一提交,这样如果第二句出现了异常,那么第一句由于已经提交无法自动rollback,造成错误的记录产生。...对于友链页评论的读取添加了如下的事务注解: @Transactional(readOnly = true)     评论页除了查询当前分页的评论列表还要查询评论总数用于前端进行分页规划,如果评论总数和当前页匹配...所以一定要新建一个类写该异步方法,然后业务自动注入该类(代理类),调用对应方法。...回顾之后发现,这大大的理论架构最终实践springboot中却非常的简单。    ...简单说下一二级缓存的区别:     一级缓存:sqlsession会话级别的,多对单次请求多次查询同一数据开启的缓存策略,springboot默认开启的,且不需要配置。

37110

SpringBoot之解决整合多数据源多事物注解问题

SpringBoot之解决整合多数据源多事物注解问题 概念:   因为整合了多数据源,就代表我的项目中存在多个事物管理器,这样就不能直接使用@Transactional 修改代码: 修改user2接口...模拟异常,查看事物是否回滚,添加@Transactional ?...但是Spring的事物管理器中却有两个事物管理器,这时他就不知道使用哪个了 这里说一下,Springboot2之后默认就是开始事物的不用单独写@EnableTransactionManager了 解决...:   事物的注解中指定事物管理器 指定为springbootTransactionManager ?...查看数据库有没有数据 刷新并没有数据,事物控制成功 ? 尝试输入正常值 ? 后端没有报错,数据库成功插入数据 ?

74230

SpringBoot事务配置管理

事务管理是SpringBoot框架中最为常用的功能之一,我们实际应用开发时,基本上service层处理业务逻辑的时候都要加上事务,当然了,有时候可能由于场景需要,也不用加事务(比如我们往一个表里插数据...,相互没有影响,插多少是多少,不能因为某个数据挂了,把之前插的全部回滚) 2.SpringBoot事务配置 2.1 依赖导入 SpringBoot中使用事务,需要导入mybatis依赖:...,会造成事务回滚,我们刷新一下数据库,并没有增加一条记录,说明事务生效了。...,可以 @Transactional注解中使用rollbackFor属性来指定异常,比如@Transactional(rollbackFor = Exception.class),这样就没有问题了。...3.2 异常被“吃”掉 我们处理异常时,有两种方式,要么抛出去,让上一层来捕获处理,要么把异常try catch掉,异常出现的地方给处理掉,就因为有这种try catch,所以导致异常被“吃”掉,事务无法回滚

1.1K40

聊一聊使用Spring事物时生效的场景

前言 今天介绍一下Spring事物生效的场景,事物是我们项目中经常使用的,如果是Java的话,基本上都使用Spring的事物,不过Spring的事物如果使用不当,那么就会导致事物失效或者不回滚,最终导致数据不一致...注解,而它调用了save方法,save方法标了@Transactional,不过事物不会生效,这是因为方法没被代理,直接是普通方法调用,所以事物自然生效。...1.如果我们程序代码中自己捕获了异常导致Spring事物捕获不到异常,那么事物也不会生效,如下,exceptionMethod方法捕获了异常并打印异常信息,那么异常并不会被Spring事物捕获到,所以事物并不会回滚...,不过如果在进行业务开发的时候,对于需要其它类进行调用的方法,我们都是以public修饰,因为如果以private修饰,其它类想要访问的话需要借助反射才能访问,IDEA中,@Transactional...,因为SpringBoot默认帮我们装配好了,我们直接使用就好。

13530

SpringBoot声明式事务的简单运用

SpringBoot中默认配置了第二种方式,所以,SpringBoot直接使用注解即可。下面介绍SpringBoot通过注解开启事物的使用。...SpringBoot使用事物的步骤: 第一步:启动类上开启事物支持 提示:@EnableTransactionManagement注解其实在大多数情况下,不是必须的,因为SpringBoot...ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class),而一 般情况下,这两个条件都是满足的,所以一般的,我们启动类上写写...{xxx1.class, xxx2.class,……} …… ---- 注意事项: service实现类(一般建议接口上)上添加@Transactional,可以将整个类纳入spring事务管理...可以 …… ---- piapia规范推荐: 事务场景中,抛出异常被catch,如果需要回滚,一定要手动回滚事务。

41540

Springboot事务处理

rollbackFor 指定哪些异常可以导致事务回滚,默认是Throwable的子类 noRollbackFor 执行哪些异常不可用引起事务回滚,默认是Throwable的子类 2、springboot...事务使用 Spring boot是默认启动事务的,只需要在类或者方法上添加@Transactional注解即可,但有时候会发现事务生效,具体原因可以从以下几个方面找寻: 1、首先要看数据库引擎是否支持注解...及其子类)和 Error 进行回滚; 4、如果是其它异常,可以显形标记在参数里,下图标红的就是先进行查看用户有指定的异常,如果没有,就默认上一条的异常,参数格式:@Transactional(rollbackFor...={Exception.class}) 5、是否进行了异常捕获,如果使用了try–catch,事务是肯定生效,也就是系统没有接收到异常场景; 关于使用异常捕获,还想事务生效,可以有几种策略解决相关难题...: 1)手动回滚,推荐方式 2)catch里抛出一个runntimeException 3) 将异常写入注解参数里面,也需要抛出来,原理跟方法2一样的,只是重新指定了事务回滚的异常类型

68920

SpringBoot 系列教程之事务生效的几种 case

SpringBoot 系列教程之事务生效的几种 case 前面几篇博文介绍了声明式事务@Transactional的使用姿势,只知道正确的使用姿势可能还不够,还得知道什么场景下不生效,避免采坑。...生效 case 声明式事务的使用教程200119-SpringBoot 系列教程之声明式事务 Transactional 中,也提到了一些事务生效的方式,比如声明式事务注解@Transactional...私有方法 私有方法上,添加@Transactional注解也不会生效,私有方法外部不能访问,所以只能内部访问,上面的 case 生效,这个当然也生效了 /** * 私有方法上的注解,生效 *...异常匹配 @Transactional注解默认处理运行时异常,即只有抛出运行时异常时,才会触发事务回滚,否则并不会如 /** * 非运行异常,且没有通过 rollbackFor 指定抛出的异常生效...小结 下面小结几种@Transactional注解事务生效的 case 数据库不支持事务 注解放在了私有方法上 类内部调用 未捕获异常 多线程场景 传播属性设置问题 III. 其他 0.

74130

肝了一周总结的SpringBoot常用注解大全,看完就炉火纯青了!

request:同一请求中使用相同的实例,不同请求重新创建。 session:同一会话中使用相同的实例,不同会话重新创建。...推荐使用Java配置,该类中声明的Bean等配置将被SpringBoot的组件扫描功能扫描到。...全局异常处理示例 /** * @auther macrozheng * @description 全局异常处理 * @date 2020/2/27 * @github https://github.com...@After 表示后置通知(After),通知方法会在目标方法返回或抛出异常执行。 @AfterReturning 表示返回通知(AfterReturning),通知方法会在目标方法返回执行。...@AfterThrowing 表示异常通知(AfterThrowing),通知方法会在目标方法返回执行。

80920

面试前看了这篇spring事务的文章,让我多要了2k的工资

一、开启事务功能 1、spring开启事务 有些朋友的公司可能还没有使用springboot,这里我介绍一下spring的事务开启。...spring基于注解事务开启的功能,先介绍到这里,下面我们一起看看springboot是如何开启事务的。 2、springboot自动开启事务 ?...这里就可以解释,为什么我们springboot程序里面没有使用过@EnableTransactionManagement注解开启事务,它却自动拥有事务的功能。...接下来,我们的重点是TransactionInterceptor,因为它里面实现了事务的逻辑。 二、核心拦截器 废话不多说,直接上TransactionInterceptor的代码。...那么问题来了,如果异常类型是Exception需要回滚?如果不需要回滚,怎样才能让异常类型是Exception的事务回滚?

63343

springboot注解大全注解(spring两个方法都注解事务)

关系型数据库多用到事务,传统项目中使用xml配置,配置虽然也还好,但是看着很不美观,使用SpringBoot框架,就简单的多了,以实战为准,直接上代码 @Transactional spring 事务注解...,否则抛出异常 @Transactional(propagation=Propagation.MANDATORY) 必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY...isolation=Isolation.DEFAULT) 3.指定事务管理器 spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持,...然后访问数据库的Service方法上添加注解 @Transactional 便可。...然后Service中,被 @Transactional 注解的方法,将支持事务。如果注解类上,则整个类的所有方法都默认支持事务。

47720

Spring Data JPA系列4——Spring声明式数事务处理与多数据源支持

第2篇《Spring Data JPA系列2:快速SpringBoot项目中熟练使用JPA》中也知晓了SpringBoot项目快速集成SpringData JPA以及快速上手使用JPA来进行基本的项目开发的技能...执行过程: (1) 先执行完获取用户表count数,得到结果10 (2) 还没开始执行一条语句的时候,另一个进程操作了DB并往用户表中插入一条新数据 (3) 复合操作的第二条SQL语句,获取用户列表的操作被执行...因为这个里的操作都是一些只读操作,所以设置为只读事务,数据库会为只读事务提供一些优化手段,比如不启动回滚段、记录回滚log之类的。...如果指定,则默认取值为Propagation.REQUIRED,也即如果当前存在事务,则加入该事务,如果当前没有事务,则创建一个新的事务。...快速上手 —— 《Spring Data JPA系列2:SpringBoot集成JPA详细教程,快速项目中熟练使用JPA》 深度进阶 —— 《Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍

81710

SpringBoot - 优雅的处理【长事务】

文章目录 Pre What How 方法一 编程式事务 使用@Transactional 又能避免产生长事务 方法一 方法二 ---- Pre SpringBoot - 实践阿里巴巴【Manager...层_通用业务处理层】 Spring体系中,方法上加上注解@Transactional,Spring自动帮我们进行事务的开启、提交、回滚操作,真的是太方便了,以至于不分青红皂白,啥都搞上… ----...这种拆分会命中使用@Transactional注解时事务生效的经典场景....其他几个常见的事务生效的场景为: @Transactional 应用在非 public 修饰的方法上 @Transactional 注解属性 propagation 设置错误 @Transactional...注解属性 rollbackFor 设置错误 同一个类中方法调用,导致@Transactional失效 异常被catch捕获导致@Transactional失效 每日一博 - 常见的Spring事务失效

1.7K10

TransactionalEventListener使用场景与原理分析

一、背景 开发中有这样一个场景,客服业务需要接入在线能力,基于其他团队的IM底层能力构建业务层能力,也就是需要先调二方restful服务创建群聊,然后调用本地服务创建会话,并且创建会话依赖于二方服务返回的群聊信息...、TiDB等), 分布式事务并不是一个很好的选择,这个时候我们就可以考虑产生异常时候手动回滚二方服务的方式。...,流程终止执行本地业务,如果二方服务正常,执行本地业务,如果本地执行成功,整个流程执行成功,如果本地执行异常,本地数据回滚,然后发出异常事件,由TransactionalEventListener执行二方数据的手动回滚或者订正...,也就是本地事务出现异常回滚触发该事件监听。...这样就能实现二方服务执行成功,本地事务回滚,然后补偿订正二方服务数据了。当然也可以事务的上层调用方捕获并识别异常,然后根据需要决定是否需要补偿。

5.1K41

SpringBoot 系列教程之声明式事务 Transactional

200119-SpringBoot 系列教程之声明式事务 Transactional 当我们希望一组操作,要么都成功,要么都失败时,往往会考虑利用事务来实现这一点;之前介绍的 db 操作,主要在于单表的...配置 本篇主要介绍的是jdbcTemplate配合事务注解@Transactional的使用姿势,至于 JPA,mybatis 实际的使用区别上,并不大,后面会单独说明 创建一个 SpringBoot...; } 我们需要开启事务的公共方法上添加注解@Transactional,表明这个方法的正确调用姿势下,如果方法内部执行抛出运行异常,会出现事务回滚 注意上面的说法,正确的调用姿势,事务才会生效;换而言之...适用场景 使用注解@Transactional声明式事务时,其主要是借助 AOP,通过代理来封装事务的逻辑,所以 aop 生效的场景,也适用于这个事务注解生效的场景 简单来讲,下面几种 case,...异常类型 此外,注解@Transactional默认只针对运行时异常生效,如下面这种 case,虽然是抛出了异常,但是并不会生效 @Transactional public boolean testNormalException

1.9K30

【小家java】Spring事务生效的原因大解读

因此我们使用spring事务的时候,门槛变得异常的低,小学生水平就能很好的管理好事务,但是同学们或多或少都遇见过一些事务生效的难题,为啥呢?...接口上使用 @Transactional 注解,只能当你设置了基于接口的代理时它才生效。...@EnableTransactionManagement springboot1.4以后可以写。...,否则事务也是生效的,比如下面代码事务生效: @Transactional @Override public void save(User user1, User user2) { new...本文只应用层面帮大家汇总一下事务生效的原因,其实更有效的理解必须结合springboot的源码进行讨论,这个在后续博文中会深入源码级别分析,各位看官可持续关注 4、最后 任何一件事情本身的复杂度是不会改变的

2.9K30

SpringBoot 使用 @Transactional 注解配置事务

SpringBoot项目中需要配置事务管理,所以在这里系统地整理下关于@Transactional 注解相关的知识! ---- 1、详细介绍 事务管理是应用系统开发中必不可少的一部分。...如果你 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。...---- 2、使用方法 注:SpringBoot项目会自动配置一个 DataSourceTransactionManager,所以我们只需方法(或者类)加上 @Transactional 注解,就自动纳入...javac在编译时,不会提示和发现这样的异常,不要求程序处理这些异常。所以如果愿意,我们可以编写代码处理(使用try…catch…finally)这样的异常,也可以处理。...而synchronized代码块执行是事务之内执行的,可以推断synchronized代码块执行完时,事务还未提交,其他线程进入synchronized代码块,读取的数据不是最新的。

6.7K20

springboot开启声明式事务

前言 本小节回顾一下springboot中的声明式事务处理方式,也是实际项目中目前应用最多的一种事务处理方式,底层是基于aop来实现的 实现方式 1.配置类上加上@EnableTransactionManagement...实现类中加上@Transactional,如果该类中某个业务方法执行时报错会进行回滚写法为:@Transactional(rollbackFor = Exception.class) 知识小结 开启注解事务管理...添加该注解,Spring容器会自动扫描被@Transactional注解的方法和类。...建议分开写,互相调用 对应数据库使用的存储引擎不支持事务,比如:MyISAM 说明 Spring的事务注解@Transactional,使用该注解时候,我们可以代码中做异常处理,例如try...但是,如果我不做异常配置,事务注解@Transactional默认什么情况会抛异常呢?

70810

springboot事物oracle,SpringBoot 事务管理

导入依赖 当导入jdbc或者jpa依赖SpringBoot会自动分别注入DataSourceTransactionManager 或 JpaTransactionManager。...1)@Transactional注解默认只会对运行期异常( java.lang.RuntimeException及其子类)和Error进行回滚; 2)@Transactional注解只能被应用到public...事务回滚 讲事务隔离级别和事务传播性之前,先讲一下SpringBoot中,我们平常是怎样控制事务回滚的。...因为@Transactional注解的方法结束,事务就被提交了。...例:事务1中需要多次读取数据A,第一次读取完成,事务2对数据A有操作,事务1再次读取数据A,会读取到事务2操作的结果,但事务2因异常进行了回滚。这时候事务1对数据A就产生了脏读。

58110
领券