Transactional 注释在使用 try catch 的 for 循环中不起作用

我的问题如下。伪代码代码如下:


public Object rollBackTestMainMethod(List<Object> list) {


  List<Object> responseList = new ArrayList<>();


  for(Object item:list){


    try{    

      Boolean isOperationSuccess = rollBackTestSubMethod(item);

      if (isOperationSuccess==null || !isOperationSuccess){

        item.addError("Operation failed");

        item.addSuccess(false);

      } else {

        item.addError(null);

        item.addSuccess(true);

      }


    } catch(Exception exception) {

      item.addError(exception.getMessage());

      item.addSuccess(false);

    }


    responseList.add(item);

  }


  return responseList;

}


@Transactional(rollbackFor = {Exception.class, SQLException.class})

private Boolean rollBackTestSubMethod(Object listItem){


  Long value1=save(listItem.getValue1());

  if(value1==null){

    throw new Exception("Error during save 1");

  }

我在这里做什么:

  1. 在 中迭代一个列表rollBackTestMainMethod()。发送一个列表项rollBackTestSubMethod()并执行 3 保存操作。

  2. 如果全部保存完成则返回真响应,否则抛出异常。

  3. rollBackTestMainMethod(),在得到响应或异常后,在每个项目上添加错误或成功值。

  4. 它将此项添加到名为 的新列表中responseList。在所有操作之后,它会将其作为响应发送回来。

我的问题:

  1. rollBackTestSubMethod()它抛出后不会回滚,因为它是从 try catch 块调用的。

  2. 如果我想强制回滚,TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();那么它将回滚所有项目以进行任何抛出/异常。

  3. 在这里,我只想回滚投掷物品而不是所有物品。

  4. 此方法在 Spring bean 中

  5. 我正在通过spring data jpa将数据保存到我的关系数据库中


慕哥9229398
浏览 289回答 2
2回答

MYYA

这是因为您正在@Transactional从同一个 bean 中调用方法。@Transactional仅适用于在 spring 创建的代理上调用的方法。这意味着,当您创建一个@Service或其他 bean 时,从外部调用的方法将是事务性的。如果从 bean 中调用,什么都不会发生,因为它不通过代理对象。最简单的解决方案是将方法移至另一个@Service或 bean。如果你真的想将它保存在同一个组件中,那么你需要调用它,以便它被 spring AOP 包装在代理中。你可以这样做:private YourClass self;@Autowiredprivate ApplicationContext applicationContext;@PostConstructpublic void postContruct(){&nbsp; &nbsp; self = applicationContext.getBean(YourClass.class);}然后调用方法self将导致打开事务。

慕仙森

标记非公共方法 @Transactional 既无用又具有误导性,因为 Spring 没有“看到”非公共方法,因此没有为它们的正确调用做准备。Spring 也没有为它调用的方法调用的方法做准备。因此,标记私有方法,例如,@Transactional 只有在方法实际上被写入@Transactional 时才会导致运行时错误或异常。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java