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. То есть откат не работает.
Любое предложение очень ценится. Заранее спасибо!