首页
学习
活动
专区
工具
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。

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

相关·内容

5分58秒

我搞了一个方案验证阿里云server2008r2/2012r2/2016/2019/2022在线迁移

领券