SpringBatch, транзакция не работает - ни с аннотацией @Transactional, ни с DatasourceTransactionmanager

Я использую SpringBatch для своего приложения. В одном из пакетных заданий мне нужно обработать несколько данных. Каждые данные требуют нескольких обновлений базы данных. И мне нужно сделать одну транзакцию для одних данных. Это означает, что если при обработке одних данных возникает исключение, обновления базы данных откатываются для этих данных, а затем продолжают обработку следующих данных.

Я поместил все обновления базы данных одним методом на уровне обслуживания. В моем тасклете springbatch я вызываю этот метод для каждых данных, например:

      for (RequestViewForBatch request : requestList) {
  orderService.processEachRequest(request);
}

В orderService.processEachRequest я помещаю все, что мне нужно сделать, в одни данные.

я пытался

  • с использованием аннотации @Transactional
  • с использованием DatasourceTransactionalManager

и ни то, ни другое не помогло мне.

Мой код для использования аннотации @Transactional приведен ниже;

      @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, timeout = 100, rollbackFor = Exception.class)
  public void processEachRequest(RequestViewForBatch request) {

  //selecting and updating data 
  process1.updating table A
  process2.updating table B

}

И у меня это не работает. Это означает, что если в процессе 2 возникает исключение, обновление, внесенное в таблицу A, не откатывается.

Для использования DatasourceTransactionalManager,

         DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
    transactionManager.setDataSource(setDataSource());
    transactionManager.setRollbackOnCommitFailure(true);
    TransactionStatus txStatus =
        transactionManager.getTransaction(new DefaultTransactionDefinition());

    try {

      //processing a data

        transactionManager.commit(txStatus);
      }
    } catch (Exception e) {
      e.printStackTrace();
      transactionManager.rollback(txStatus);
    }
  }

      public DataSource setDataSource() {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.postgresql.Driver");
        dataSourceBuilder.url("xxxxxxxxx"); //masking actual property
        dataSourceBuilder.username("xxxxxxx"); //masking actual property
        dataSourceBuilder.password("xxxxx"); //masking actual property
        return dataSourceBuilder.build();
    }

И результат, который я получаю, тот же, что и с аннотацией @Transactional. То есть откат не работает.

Любое предложение очень ценится. Заранее спасибо!

0 ответов

Другие вопросы по тегам