@Transactional注释不适用于方法

时间:2019-07-09 08:26:03

标签: java database spring-boot

我正在使用oracleDB和elasticsearch进行持久化,如果该方法出现任何问题,它将引发一个自定义异常。现在,如果任何事情也无法通过弹性恢复,那么我需要从数据库回滚。

我已经在服务类上添加了@transactional注释。以及我在网上找到的所有内容。

@Transactional(rollbackOn = BaseException.class)
public void transaction(ab ab, a a) {
    persistenceService.save(a);
    persistenceService.updateSignalCountDb(a.abc(), a.bcd(), ab);
    elasticService.saveSignal(a);

    try {
        elasticService.updateSignalCountElastic(a);
    } catch (Exception e) {
        throw new BaseException(ErrorCodes.FAILED_ELASTIC_SEARCH_UPDATE, e);
    }
}

persistenceService.save()方法保存在db中。 persistenceService.updateSignalCountDb()方法更新db中的另一个表。 elasticService.saveSignal()方法可节省弹性。失败时抛出基本异常。 elasticService.updateSignalCountElastic()方法更新elastic中的另一个索引。它还会调用elasticService.delete()方法以删除发生故障时保存在elastic中的所有内容,并引发基本异常。

我希望这在整个方法失败的情况下仍然有效。但是,如果任何事情在弹性上失败了,我都会得到一个基本异常,但是我从oracle db获得的数据不会回滚。

2 个答案:

答案 0 :(得分:0)

乍一看,看来您做对了所有事情。但是,在搜索不起作用的原因之前,对代码进行小的更改将首先防止出现此问题:

  @Transactional(rollbackOn = BaseException.class)
  public void transaction(ab ab, a a){
    try {
      elasticService.saveSignal(a);
      elasticService.updateSignalCountElastic(a);
      persistenceService.save(a);
      persistenceService.updateSignalCountDb(a.abc(), a.bcd(), ab);
    }catch (Exception e){
      throw new BaseException(ErrorCodes.FAILED_ELASTIC_SEARCH_UPDATE, e);
    }
  }

在这种情况下,您的异常将在您保存到DB中之前发生,并且不会出现问题

答案 1 :(得分:0)

  1. 如果您使用的是Spring ['Pedrito De Rosa', 'NIE X1111222233', 'tf 2283396922', 'efael@hostmailer.com'] ['Paseo Jauregizahar 234 - 1. A. Donostia '] ['paisaje y ciudad '] ['2014-12-10 Avance Normas Subsidiarias', 'Otras consultas'] ,我研究过 @Transactional选项,但没有rollbackFor(我不确定),例如 这个:rollbackOn

  2. 确保在春季配置中启用了事务处理:@Transactional(rollbackFor = BaseException.class)

  3. 在您的情况下,只有@EnableTransactionManagement会触发回滚,其他BaseException不会触发。