Spring Batch 如何管理事务(可能有多个数据源)?
How does Spring Batch manage transactions (with possibly multiple datasources)?
我想了解有关 Spring 批处理中数据流的一些信息,但未能在 Internet 上找到我要查找的内容(尽管 在该站点上)。
我正在尝试建立在我们公司使用 Spring Batch 的标准,我们想知道当多个处理器在一个步骤中更新不同数据源上的数据时,Spring Batch 的行为如何。
此问题侧重于分块过程,但请随时提供有关其他模式的信息。
据我所见(如果我错了请纠正我),当读取一行时,它会在读取下一行之前遵循整个流程(reader,处理器,编写器)(相反到筒仓处理,其中 reader 将处理所有行,将它们发送到处理器,依此类推。
在我的例子中,多个处理器读取数据(在不同的数据库中)并在此过程中更新它们,最后写入器将数据插入另一个数据库。目前,JobRepository 没有链接到数据库,但那将是一个独立的数据库,这使得事情仍然有点复杂。
无法更改此模型,因为数据属于多个业务领域。
在这种情况下如何管理事务?数据是否仅在处理完整个块后才提交?然后,是否有两阶段提交管理?它是如何保证的?应该做哪些开发或配置才能保证数据的一致性?
更一般地说,在类似情况下您的建议是什么?
Spring批量使用Spring核心transaction management, with most of the transaction semantics arranged around a chunk of items, as described in section 5.1 of the Spring Batch docs.
读取器和写入器的事务行为完全取决于它们是什么(例如文件系统、数据库、JMS 队列等),但是如果资源配置为支持事务,那么它们将被 [=21= 征用] 自动地。 XA 也是如此 - 如果您使资源端点符合 XA,那么它将使用 2 阶段提交。
回到块事务,它将在块的基础上设置一个事务,因此如果您在给定的 tasklet 上将提交间隔设置为 5,那么它将打开和关闭一个新事务(包括所有管理的资源由事务管理器)为设置的读取次数(定义为提交间隔)。
但是所有这些都是围绕从单个数据源读取而设置的,这是否符合您的要求?我不确定 spring 批处理是否可以管理从多个来源读取数据并将处理器结果写入单个事务中的另一个数据库的事务。 (事实上我想不出有什么可以做到的...)
我想了解有关 Spring 批处理中数据流的一些信息,但未能在 Internet 上找到我要查找的内容(尽管
我正在尝试建立在我们公司使用 Spring Batch 的标准,我们想知道当多个处理器在一个步骤中更新不同数据源上的数据时,Spring Batch 的行为如何。
此问题侧重于分块过程,但请随时提供有关其他模式的信息。
据我所见(如果我错了请纠正我),当读取一行时,它会在读取下一行之前遵循整个流程(reader,处理器,编写器)(相反到筒仓处理,其中 reader 将处理所有行,将它们发送到处理器,依此类推。
在我的例子中,多个处理器读取数据(在不同的数据库中)并在此过程中更新它们,最后写入器将数据插入另一个数据库。目前,JobRepository 没有链接到数据库,但那将是一个独立的数据库,这使得事情仍然有点复杂。
无法更改此模型,因为数据属于多个业务领域。
在这种情况下如何管理事务?数据是否仅在处理完整个块后才提交?然后,是否有两阶段提交管理?它是如何保证的?应该做哪些开发或配置才能保证数据的一致性?
更一般地说,在类似情况下您的建议是什么?
Spring批量使用Spring核心transaction management, with most of the transaction semantics arranged around a chunk of items, as described in section 5.1 of the Spring Batch docs.
读取器和写入器的事务行为完全取决于它们是什么(例如文件系统、数据库、JMS 队列等),但是如果资源配置为支持事务,那么它们将被 [=21= 征用] 自动地。 XA 也是如此 - 如果您使资源端点符合 XA,那么它将使用 2 阶段提交。
回到块事务,它将在块的基础上设置一个事务,因此如果您在给定的 tasklet 上将提交间隔设置为 5,那么它将打开和关闭一个新事务(包括所有管理的资源由事务管理器)为设置的读取次数(定义为提交间隔)。
但是所有这些都是围绕从单个数据源读取而设置的,这是否符合您的要求?我不确定 spring 批处理是否可以管理从多个来源读取数据并将处理器结果写入单个事务中的另一个数据库的事务。 (事实上我想不出有什么可以做到的...)