首页
学习
活动
专区
工具
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事务配置管理[通俗易懂]

使用功能场景: 由于数据操作在顺序执行的过程中,线上可能有各种无法预知的问题,任何一步操作都有可能发生异常,异常则会导致后续的操作无法完成,此时由于业务逻辑并未正确的完成,所以在之前操作数据库的动作并不可靠,需要在这种情况下进行数据的回滚。 事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就回退到事务未进行操作的状态。 事务管理是SpringBoot框架中最为常用的功能之一,我们在实际应用开发时,基本上在service层处理业务逻辑的时候都要加上事务,当然了,有时候可能由于场景需要,也不用加事务(比如我们往一个表里插数据,相互没有影响,插多少是多少,不能因为某个数据挂了,把之前插的全部回滚)

04
领券