在等待下一步之前,我可以让 Spring 步骤在第一步中提交到 db 吗?

Posted

技术标签:

【中文标题】在等待下一步之前,我可以让 Spring 步骤在第一步中提交到 db 吗?【英文标题】:Can I make Spring step to commit to db in first step before waiting next step? 【发布时间】:2021-10-09 06:01:33 【问题描述】:

早安,

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

更多信息:

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

What does EntityManager.flush do and why do I need to use it?

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

【讨论】:

更多参考:logicbig.com/tutorials/java-ee-tutorial/jpa/refreshing.html

以上是关于在等待下一步之前,我可以让 Spring 步骤在第一步中提交到 db 吗?的主要内容,如果未能解决你的问题,请参考以下文章

让线程在开始下一组任务之前等待所有任务完成

如何在不完成 Bootstrap 中的一个步骤的情况下禁用进入下一步?

Selenium常用的三种等待方式

Java环境配置

在css中如何让文字显示方式从右边开始

Accordion Form:在启用下一步之前检查必填字段