【问题标题】:Avoid nested transaction避免嵌套事务
【发布时间】:2018-10-07 04:18:21
【问题描述】:

下面是我的方法的结构:

    @Override
    @Transactional
    public methodOuter(){
      //some processing
      methodInner1();
      methodInner2();
    }

    @Override
    @Transactional
    public methodInner1(){
    //save something to db
    }

    @Override
    @Transactional
    public methodInner2(){
    //some processing
    //throws exception
    }

场景是methodInner1() 处理成功但methodInner2() 抛出异常。所以我想回滚在methodInner1() 中完成的提交。目前methodInner1() 中的提交没有回滚。我希望 methodOuter() 进行单笔交易

【问题讨论】:

  • 您可以在这里利用不同的交易模式。我想你需要的是使用现有的 else 创建新的
  • 您可以在methodInner1()methodInner2() 上使用PROPAGATION_REQUIRED,这将使所有方法在单个事务中执行。

标签: java spring-boot transactional propagation


【解决方案1】:

如果您知道抛出异常的类型(假设它是 NPE),您可以尝试类似

@Override
@Transactional(rollbackOn=NullPointerException.class)
public methodOuter(){
  //some processing
  methodInner1();
  methodInner2();
}

@Override
public methodInner1(){
  //save something to db
}

@Override
public methodInner2(){
  //some processing
  //throws exception
}

在这种情况下,您不需要注释“内部”函数。如果抛出 NullPointerException,methodOuter 将被回滚。如果你想回滚每一个可能的异常,你应该将注释更改为

@Transactional(rollbackOn=Exception.class)

顺便说一句:RuntimeExceptions 无论是否注解都会导致回滚。

【讨论】:

    猜你喜欢
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2016-11-19
    • 2014-08-23
    • 2023-01-30
    相关资源
    最近更新 更多