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

时间:2015-05-26 12:20:52

标签: java transactions spring-batch

我想了解有关Spring Batch处理中数据流的一些信息,但无法在Internet上找到我要查找的内容(尽管本网站上有some useful questions)。

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

这个问题集中在一个分块的过程,但随时提供其他模式的信息。

从我所看到的(如果我错了请纠正我),当读取一行时,它会在下一个读取之前跟随整个流程(读取器,处理器,写入器)(而不是一个筒仓处理,其中读者将处理所有行,将它们发送到处理器,等等。

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

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

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

更一般地说,在类似情况下你的推荐是什么?

1 个答案:

答案 0 :(得分:1)

Spring批处理使用Spring核心transaction management,大多数事务语义排列在一大块项目周围,如第5.1节of the Spring Batch docs所述。

读者和作者的交易行为取决于他们究竟是什么(例如文件系统,数据库,JMS队列等),但如果资源配置为支持事务,那么他们将被spring自动登记。 XA也是如此 - 如果您使资源端点符合XA标准,那么它将使用2阶段提交。

回到块事务,它将以块为基础设置事务,因此如果在给定的tasklet上将提交间隔设置为5,则它将打开并关闭新事务(包括由管理的所有资源)事务管理器)用于设置的读取次数(定义为commit-interval)。

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