在等待下一步之前,我可以让 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章