首页 > 解决方案 > Spring Batch 事务管理 - 多线程步骤

问题描述

我在批处理作业中使用多线程步骤来处理来自源数据库的记录并写入目标数据库。Step 是基于块的,由 JdbcpagingItemReader、Processor 和 JdbcBathItemWriter 组成。我知道如果在 Step 处理期间发生任何异常,数据库事务将回滚整个块。我想了解这是如何在 Spring 批处理内部进行管理的?由于这是多线程步骤,因此无法保证处理器和写入器在块的同一线程中执行。该块可能由不同的线程处理。那么,即使不同的线程作用于同一个块,Spring 批处理如何确保数据库事务正确回滚呢?

标签: multithreadingspring-bootspring-batchspring-jdbc

解决方案


你的说法不正确: "The chunk may get processed by different Threads."

参考 Spring 批处理文档,关于Multi-threaded Step, Step 通过在单独的执行线程中读取、处理和写入每个项目块来执行。所以多线程是在Step 级别而不是在 chunk 级别启用的,它在自己的线程中执行每个块;因此每个线程都将“运行”一个读-处理-写组合。

上述配置的结果是,Step 通过在单独的执行线程中读取、处理和写入每个项目块(每个提交间隔)来执行。请注意,这意味着要处理的项目没有固定的顺序,并且与单线程情况相比,一个块可能包含不连续的项目。除了任务执行器设置的任何限制(例如它是否由线程池支持)之外,tasklet 配置中还有一个节流限制,默认为 4。您可能需要增加此限制以确保线程池是充分利用。

在此处输入图像描述

因此,由于每个块都在专用线程上运行,因此事务管理非常简单。


推荐阅读