当前位置: 首页 > 知识库问答 >
问题:

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

盖绪
2023-03-14

我想要一些关于Spring Batch处理中数据流的信息,但在Internet上找不到我要找的东西(尽管本网站上有一些有用的问题)。

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

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

从我所看到的情况来看(如果我错了,请纠正我),当一行被读取时,它在下一行被读取之前遵循整个流程(读卡器、处理器、写入器)(与竖井处理相反,在竖井处理中,读卡器将处理所有行,将它们发送给处理器,等等)。

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

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

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

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

共有1个答案

沈运恒
2023-03-14

Spring batch使用Spring核心事务管理,大多数事务语义围绕一块项目进行安排,如Spring batch docs第5.1节所述。

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

回到chunk事务,它将在chunk的基础上设置一个事务,因此如果在给定的tasklet上将提交间隔设置为5,那么它将根据设置的读取次数(定义为提交间隔)打开和关闭一个新事务(包括事务管理器管理的所有资源)。

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

 类似资料:
  • 问题内容: 我在Junit应用程序上下文文件中定义了三个(JDBC)。其中两个需要进行事务管理;使用这两个数据源时,我不必链接任何方法(它们完全彼此独立)。 当我使用单个事务管理器作为时,我没有问题,即使已被使用但未在相应方法中进行管理。尽管如此,在还需要管理来自各种DAO类的方法(仅使用这些方法)后,我添加了第二个事务- 。上下文文件包含以下内容: 由于要定义多个事务管理器,因此我用他们自己的值

  • 我正在开发一个应用程序,其中我必须根据从客户端传递的客户id连接到不同的数据库。所有数据库的模式都是相同的。它是一种多租户应用程序。由于我不知道会有多少客户,我无法使用xml配置静态创建数据源,因此我必须手动创建数据源。 我们使用Spring JdbcTemplate连接到数据库,连接参数来自另一个保存应用程序配置的数据库。我能够正确连接到数据库,但方法调用不会在事务中发生。下面的代码片段只对一个

  • 我正在构建一个spring boot应用程序,它有多个数据源、实体管理器、事务管理器和数据库。每一个都是为一个客户提供的,并共享相同的DAO、服务。 数据源之间的切换工作得很好。但我对交易有问题 这里是我的配置: } 根据配置文件加载数据源。像LoadCust4DatasourceCondition之类的类用于检查是否加载。 我的数据源配置文件是: 我的服务就像: 我的刀是这样的: 在服务级别,如

  • 我正在尝试用Java创建一个PoC应用程序,以了解在使用Kafka进行消息发布时如何在Spring Cloud Stream中进行事务管理。我试图模拟的用例是一个接收消息的处理器。然后,它进行一些处理,并生成两条发送到两个不同主题的新消息。我希望能够将这两条消息作为单个事务发布。因此,如果发布第二条消息失败,我希望滚动(而不是提交)第一条消息。SpringCloudStream支持这样的用例吗?

  • 在我的spring服务中,我调用了两个spring数据存储库方法 现在我的查询与事务管理相关。就我所了解和看到的代码而言,spring存储库使用@Transactional为其方法启用了事务。对于select操作,它的readonly=true。 我对事务的理解是,当执行选择操作时,会创建一个事务,然后为保存操作创建另一个事务,因为对于选择操作,事务只读=true。 我希望在单个事务中执行读写操作

  • 问题内容: 简而言之 我的命令行Java应用程序无需使用XA就可以将数据从一个数据源复制到另一个数据源。我已经配置了两个单独的数据源,并且想要一个可以在两个数据源上回滚数据的JUnit测试。我使用DBUnit将数据加载到“源”数据库中,但是无法将其回滚。我可以将“目标”数据源回滚。 我的密码 给定此配置… 和这段代码… 我所看到的问题是,@TransactionConfiguration仅说明了用