首页 > 编程语言 >spring控制事务回滚:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

spring控制事务回滚:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

时间:2022-12-06 15:22:32浏览次数:68  
标签:回滚 spring Transactional 事务 setRollbackOnly 异常 TransactionAspectSupport

spring事务控制手动回滚:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();


1、说明

  • 事务是我们开发过程中经常会使用到的,为了在业务执行过程中出现异常时,回滚到原始状态。而事务的回滚在大多数情况下都是靠着 exception(异常)来触发回滚的,当事务机制捕捉到异常,就会开始回滚。
  • 但往往也会出现情况:在业务代码中,需要对异常单独进行处理,异常不会抛出,但需要事务回滚的情况,这个时候就需要手动调用回滚

2、@Transactional

@Transactional 声明式事务,是开发过程中最常用的开启事务的方式。

优点是:使用方便,而且对代码的侵入性低

  • 这种方式,默认是通过 捕获 RunTimeException 来触发事务回滚,只要是 RuntimeException 以及 它的子类,都可以触发事务回滚。
  • 也可以修改 触发事务回滚的异常范围,可以通过修改 @Transactional 中的 rollbackFor 属性,修改异常范围。比如:
    @Transactional(rollbackFor = Exception.class),修改完成后,只要是 Exception 类的子类,都可以触发事务回滚

当然也会有事务失效的情况,可以详细参考另一篇文章@Transactional注解事务失效的几种场景及原因


3、@Transactional不适用场景

当在业务中,需要对异常进行特殊处理的时候,异常无法抛出时,声明式事务就不太适用了。
示例:

    //假设这是一个service类的片段
    try{ 
        //出现异常
    } catch (Exception e) {
        // 捕获异常,打印异常,或其他处理。但不抛出新的异常
        e.printStackTrace();
    }
    //此时return语句能够执行
    return  xxx;

当不抛出新异常时,就无法触发 事务回滚。

此处,也可以将捕获后的异常,封装为新的业务异常抛出


4、spring事务控制手动回滚

另外一种方式,就是使用 spring 事务控制的手动回滚,不抛出异常,直接调用回滚语句
示例:

    //假设这是一个service类的片段
    try{ 
        //出现异常
    } catch (Exception e) {
        // 捕获异常,打印异常,或其他处理。但不抛出新的异常
        e.printStackTrace();
        // 手动回滚
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
    //此时return语句能够执行
    return  xxx;

总结:

上述两种方式可以选择一种即可,灵活使用,可以在不能抛异常的情况下,使用手动回滚TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

标签:回滚,spring,Transactional,事务,setRollbackOnly,异常,TransactionAspectSupport
From: https://www.cnblogs.com/xiangningdeguang/p/16955383.html

相关文章

  • Spring IOC
    SpringIOC介绍介绍引用于https://baijiahao.baidu.com/s?id=1712887849553755889&wfr=spider&for=pcIOC全称是InversionofControl,控制反转。它是一种设计思想,由......
  • Spring 概述-入门案列
    Spring概述-入门案列介绍Spring是轻量级的开源的JavaEE框架Spring可以解决企业应用开发的复杂性Spring有两个核心部分:IOC和AOP(1)IOC:控制反转,把创建对象......
  • Springboot优雅进行字段检验
    Springboot优雅进行字段检验1、ControllerVSService推荐与业务无关的放在controller层中进行校验,而与业务相关的放在service层中校验。2、常用校验工具类使用Hiberna......
  • springboot2 搭建日志收集系统存入mongodb + redis+mq+线程池+xxljobs
    我们看到了高效批量插入mongodb速度还不错,那么我们的系统日志收集怎么做呢。当然当前文件日志收集效果也不错,比如前面博文写的elkf搭建日志收集系统。但我们系统中总是有......
  • springboot2 mongodb 高效批量入库--环境搭建
    当今使用微服务越来越多,每个服务都需要记录日志,那么记录到mysql中已完全不合适了。那么就记录到mongo中吧。想要速度快,那么一定要使用批量保存,做过尝试入库10万数据,逐条插......
  • Spring用XML方式使用事务
    项目开始前需要新建数据库(数据库使用mysql8.0以上的版本)#创建数据库CREATEdatabaseuserdb;#创建数据表CREATETABLEuserdb.t_account(idintNOTNULL,usernamev......
  • SpringBoot整合Netty+WebSocket
    SpringBoot整合Netty+WebSocket构建环境pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w......
  • SpringBoot 接口并发限制(Semaphore)
    可以使用JMeter辅助测试https://blog.csdn.net/weixin_45014379/article/details/124190381@RestController@RequestMapping({"/Test"})publicclasstest{L......
  • 对graalvm、springboot3.0一些新特性的探究
    环境:系统:IntelcoreMacVentura13.0.1工具: Idea:2022.2.3 gradle:7.4(idea自带的)  openjdk:version"17.0.5"2022-10-18 graalvm: CE22.3.0 ......
  • 【重温SSM框架系列】10 - Spring AOP开发的两种方式(基于XML、基于注解)
    AOP开发​​概述​​​​基于XML的AOP开发​​​​1.导入AOP依赖包​​​​2.创建目标类和接口​​​​3.创建切面类(增强方法类)​​​​4.将目标类和切面类交给Spri......