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

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();

posted @   向宁的光  阅读(7470)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示