0

再会,

我有一个使用不同步骤的 Spring 批处理,作业如下所示:

@Bean
  public Job myJob() throws Exception {
    return jobBuilderFactory.get("MyJob").repository(batchConfiguration.jobRepository())
        .start(step1()).next(step2()).build();
  }

在我的step1()中,它有自己的读取器、处理器和写入器,在这个写入器中,我将更新表 A。

然后在 my 中step2(),它也有自己的阅读器、处理器和编写器。而这个reader是从A表中读取的,从逻辑上讲,它需要依赖A表中的数据更新。

但是,当我运行这个批处理作业时,我发现我的step2()阅读器实际上选择了与 相同的数据step1(),无论如何我可以让step1()作者先提交,然后我的step2()阅读器读取更新的数据?

4

1 回答 1

0

如果您使用的是 Spring Data,您可以将 step1 注释为@Transactional(propagation = Propagation.REQUIRES_NEW),因此该操作将始终打开一个新事务,在方法完成时执行并提交。如果您在最新版本中使用 Spring Data,则另一种方法是调用 saveAndFlush()。

对于 hibernate/jdbc legacy,您可以简单地打开一个连接,在启动 step2 之前执行第一步并提交(会话和 EntityManager 具有刷新方法)。

欲了解更多信息:

https://www.baeldung.com/spring-transactional-propagation-isolation

EntityManager.flush 有什么作用,为什么需要使用它?

https://www.tutorialspoint.com/jdbc/commit-rollback.htm

于 2021-08-07T00:03:52.087 回答