【问题标题】:How does Spring Batch manage transactions (with possibly multiple datasources)?Spring Batch 如何管理事务(可能有多个数据源)?
【发布时间】:2015-05-26 12:20:52
【问题描述】:

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

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

此问题侧重于分块过程,但请随时提供有关其他模式的信息。

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

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

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

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

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

【问题讨论】:

    标签: java transactions spring-batch


    【解决方案1】:

    Spring 批处理使用 Spring 核心 transaction management,大部分事务语义围绕一大块项目安排,如第 5.1 节中所述of the Spring Batch docs

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

    回到块事务,它会在块的基础上建立一个事务,所以如果你在给定的 tasklet 上将提交间隔设置为 5,那么它将打开和关闭一个新事务(包括由事务管理器)用于设置的读取次数(定义为提交间隔)。

    但是所有这些都是围绕从单个数据源读取而设置的,这是否满足您的要求?我不确定 Spring Batch 是否可以管理从多个源读取数据并将处理器结果写入单个事务中的另一个数据库的事务。 (事实上​​我想不出有什么可以做到的……)

    【讨论】:

    • 感谢您的回答。我们将不得不面对多数据库的情况(每个业务部门都有自己的数据库,有时我们需要访问多个业务元素)。不过这些都是有用的元素。
    • 是的,我正在考虑这个问题,您必须对其进行结构化,以便事件来自单一来源,并且流程步骤可能会查询各种数据库(这将在已建立的事务中发生)和然后更新目标数据库。或者也许有一些东西聚合来自不同生产者的事件,然后让一个处理器实际执行更新。
    猜你喜欢
    • 2016-09-25
    • 2014-05-27
    • 2022-12-04
    • 2019-12-30
    • 2021-02-20
    • 2014-12-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    相关资源
    最近更新 更多