【问题标题】:Can I make Spring step to commit to db in first step before waiting next step?在等待下一步之前,我可以让 Spring 步骤在第一步中提交到 db 吗?
【发布时间】: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() 阅读器读取更新的数据?

【问题讨论】:

    标签: java spring commit writer spring-batch-tasklet


    【解决方案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

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2021-04-17
    • 1970-01-01
    相关资源
    最近更新 更多