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

Spring批处理在作业存储库和实际任务之间使用不同的事务管理器

谈琛
2023-03-14

我使用Spring Batch使用2个(可能更多,为简单起见假设为2个)数据库。一个用于存储所有作业数据(所有BATCH_*表)。另一个用于实际运行我的业务逻辑数据。有些事情我不太明白。

  1. 当我声明我的JobRepository时,我已经指定了我的TransactionManager,为什么我必须在我的tasklet上再做一次?(我没有故意使用默认名称)
  2. 我目前正在为tasklet提供与我的JobRepository相同的TrasactionManager,它管理与我在步骤中所做的不同的连接。这是否意味着我必须在我的作者或阅读器中进行自己的事务管理?
  3. 如果#2为真,Spring Batch事务管理如何工作?中的“What if”对我来说是个问题(不做XA),对吗?因为我的数据和作业数据在不同的连接中,对吗?

共有1个答案

壤驷涛
2023-03-14

您可以为任务和作业存储库使用单独的事务管理器。请看这里:http://forum.spring.io/forum/spring-projects/batch/39609-using-2-different-datasources-with-spring-batch

因此,需要指定其中两个。

话虽如此,即使您可以使用两个单独的事务管理器,但这并不意味着您应该使用。如果您不使用XA,那么想象一下如果一个业务流程成功运行但作业数据没有保存会发生什么。下次批处理过程运行时,Spring Batch会认为作业失败,并尝试再次运行它。

 类似资料:
  • 我已经开始探索Spring Batch,并遇到了一些基本问题。

  • 我有一个用例,我需要从一个Kafka主题中消费,做一些工作,生成另一个只有一次语义的Kafka主题,并保存到mongo数据库。看完文档后,我想kafka事务和mongo事务可以同步,但它们仍然是两个不同的事务。在下面的场景中,如果mongo提交失败,是否有方法回滚提交到主题并从消费者处重播的kafka记录。

  • 我想了解Spring Batch是如何进行事务管理的。这不是一个技术问题,而是一个概念性的问题:Spring Batch使用什么方法?这种方法的后果是什么? 让我试着澄清一下这个问题。例如,在TaskletStep中,我看到步骤执行通常如下所示: 准备步骤元数据的几个JobRepository事务 每一块要处理的业务事务 更多JobRepository事务,用区块处理的结果更新步骤元数据 这似乎是

  • 我试图用不同的事务管理器嵌套事务,其中如果嵌套的事务失败,外部主事务也需要回滚 我的spring配置文件有 但是,当失败时,中的事务不会回滚。如何使回滚工作?

  • 我面临一个挑战,需要从SQL Server数据库中读取“未处理”的数据,处理数据,然后有选择地更新DB2数据库中的两到六个表,然后将该数据标记为在SQL Server上的原始数据库中已处理。在任何时候,如果出现任何故障,我希望所有更新都回滚。如果我有10个未处理的项目,9个良好,但有一个失败,我仍然希望9个良好的项目完成,第10个恢复到原始状态,直到我们可以研究问题并进行更正。 总体架构是,一个输

  • 我正在创建一个由groovy bean builder支持的spring批处理(spring boot)。但是,我无法找到以下xml结构的正确语法: 更新:豆子。棒极了 我想使用选项1技术,如果我这样做,我会得到“beanName must not empty”错误。我没有使用选项2中的bean,而是它们似乎在工作。 我假设使用选项1,将使用其他定义的bean自动配置jobRepository等。