Spring Batch作业第二步无法查询到第一步插入数据库的数据问题咨询
问题原因
你遇到的是Spring Batch 事务管理的典型问题,本质是第一步写入数据的事务,在第二步执行时尚未提交,因此第二步查询不到未提交的数据,任务执行完成后所有事务最终提交,所以后续可以正常查询到数据。
解决方案
按优先级排查处理:
- 优先检查事务管理器配置
确保Spring Batch使用的事务管理器,和业务DAO、Service层绑定的是同一个DataSource对应的事务管理器。如果Spring Batch误配置了独立的事务管理器(比如测试场景下用的ResourcelessTransactionManager),会导致业务写入的事务和Spring Batch的Step生命周期解绑,Step结束时不会触发业务事务提交,直到整个Job完成才会提交。
正确配置参考(Spring Boot场景):@Configuration @EnableBatchProcessing public class BatchConfig extends DefaultBatchConfigurer { @Autowired private DataSource dataSource; @Override protected PlatformTransactionManager createTransactionManager() { return new DataSourceTransactionManager(dataSource); } } - 调整查询方法的事务配置
你虽然给getModuleList配置了Isolation.READ_UNCOMMITTED,但如果该方法的事务传播属性被设置为REQUIRES_NEW,或者第二步的操作本身在独立的只读事务中,也会导致无法读取到第一步已提交的数据。可以去掉getModuleList的事务注解,或者将查询方法的传播属性改为SUPPORTS,避免开启新的独立事务。 - 检查Step执行配置
如果你配置了异步并行Step,会导致Step2在Step1未执行完成时就启动,自然查询不到Step1未写入完成的数据。如果是顺序执行的任务,确保Step1完全执行成功后再启动Step2,同时不要自定义修改Step的自动提交策略。 - 小代码优化提醒
你示例代码中moduleService.updateModuleList遍历item时直接使用了p1-p4四个变量,实际运行时要确保是从当前遍历的item对象中获取对应属性,避免参数传错导致插入空值。
内容的提问来源于stack exchange,提问作者lobbs shi
相关产品推荐
相关产品推荐

