我正在为我的应用程序使用 SpringBatch。在其中一个批处理作业中,我需要处理多个数据。每个数据都需要多次数据库更新。我需要为一项数据进行一项交易。这意味着,如果在处理一个数据时抛出异常,则数据库更新会回滚该数据,然后继续处理下一个数据。
我已将所有数据库更新放在服务层的一种方法中。在我的 springbatch tasklet 中,我为每个数据调用该方法,如下所示;
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 注释相同。意思是,回滚不起作用。
任何建议都非常感谢。先感谢您!