Spring Batch如何管理事务(可能有多个数据源)?

2022-09-04 04:40:31

我想要一些关于Spring Batch处理中的数据流的信息,但无法在互联网上找到我正在寻找的内容(尽管这个网站上有一些有用的问题)。

我正在尝试建立标准以在我们公司中使用Spring Batch,我们想知道当一个步骤中的几个处理器更新不同数据源上的数据时,Spring Batch的行为如何。

这个问题侧重于一个分块的过程,但可以随意提供有关其他模式的信息。

根据我所看到的(如果我错了,请纠正我),当读取一行时,它会遵循整个流程(读取器,处理器,写入器),然后再读取下一行(与思洛存储器处理相反,读取器将处理所有行,将它们发送到处理器,依此类推)。

在我的例子中,几个处理器读取数据(在不同的数据库中)并在此过程中更新它们,最后编写器将数据插入到另一个数据库中。目前,JobRepository没有链接到数据库,但那将是一个独立的数据库,这使得事情仍然有点复杂。

无法更改此模型,因为数据属于多个业务领域。

在这种情况下,如何管理事务?是否仅在处理完整块后才提交数据?然后,是否有两阶段提交管理?如何确保?为了确保数据的一致性,应该进行哪些开发或配置?

更一般地说,在类似情况下,您的建议是什么?


答案 1

Spring 批处理使用 Spring 核心事务管理,大多数事务语义围绕一组项目进行排列,如 Spring Batch 文档的第 5.1 节所述。

读取器和写入器的事务行为完全取决于它们是什么(例如文件系统,数据库,JMS队列等),但如果资源配置为支持事务,那么它们将被spring自动登记。XA 也是如此 - 如果使资源终结点符合 XA 标准,则它将为其使用 2 阶段提交。

回到块事务,它将基于块设置事务,因此,如果您在给定的任务栏上将提交间隔设置为5,那么它将打开并关闭一个新事务(包括事务管理器管理的所有资源),以进行设置的读取次数(定义为提交间隔)。

但是,所有这些都是围绕从单个数据源读取而设置的,这是否符合您的要求?我不确定spring batch是否可以管理一个事务,它从多个源读取数据,并将处理器结果写入单个事务中的另一个数据库。(事实上,我想不出任何可以做到这一点的东西...)


答案 2

推荐