@ Транзакционная аннотация не работает для метода - PullRequest
2 голосов
/ 09 июля 2019

Я использую oracleDB иasticsearch для персистентности и, если что-то пойдет не так в этом методе, он генерирует пользовательское исключение.Теперь мне нужно откатиться из БД, если какая-то вещь не работает в упругой тоже.

Я уже добавил аннотацию @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 () обновляет другую таблицу в БД.МетодasticService.saveSignal () сохраняет в эластик.выдает базовое исключение в случае сбоя.МетодasticService.updateSignalCountElastic () обновляет другой индекс в упругом.Он также вызывает методasticService.delete () для удаления всего, что было сохранено вastic, в случае сбоя и выдает базовое исключение.

Я ожидал, что это сработает в случае любого сбоя во всем методе.Но если что-то не получается на эластичном, я получаю базовое исключение, но мои данные из oracle db не откатываются.

Ответы [ 2 ]

0 голосов
/ 09 июля 2019
  1. Если вы используете Spring @Transactional, я исследовал, есть только rollbackFor вариант, но не rollbackOn (я не уверен в этом), как это: @Transactional(rollbackFor = BaseException.class).

  2. Убедитесь, что транзакция включена в конфигурации пружины: @EnableTransactionManagement

  3. В вашем случае только BaseException будет вызывать откат, другие Exception не будут.

0 голосов
/ 09 июля 2019

На первый взгляд кажется, что вы все делаете правильно.Но прежде чем искать причину, по которой это не работает, небольшие изменения в вашем коде предотвратят возникновение проблемы в первую очередь:

  @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);
    }
  }

В этом случае ваше исключение произойдет еще до того, как вы сохранитев БД и у вас не будет проблем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...