0

我正在为我的应用程序使用 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 注释相同。意思是,回滚不起作用。

任何建议都非常感谢。先感谢您!

4

0 回答 0