2

假设我需要执行 2 个步骤的 spring 批处理作业。步骤 1 是从 postgres 表中读取数据并更新同一个表中的值。第 2 步是从另一个 postgres 表中读取数据并更新此表。在这种情况下,我如何在工作级别实现事务?

也就是说,如果第二步失败,那么第一步应该回滚。

4

3 回答 3

1

我不确定是否存在具有自动链式/多级事务处理的可靠工作(或在数据库端不需要大量资源)的解决方案

如果第二步失败,那么第一步应该回滚

好吧,您可以将这两个步骤合二为一:

  • 从第一个表 A 中读取
  • 使用处理器更新表 A
  • 使用处理器从表 B 中读取
  • 使用 writer 更新表 B

性能会受到很大影响,因为表 B 上的读取将是单次读取,而基于表 a 的游标

我会采用这样的补偿策略

  • (可选)使用中的表是临时表,而不是真正的“生产”表,可以更轻松地补偿数据存储与生产的解耦
  • 失败的步骤 1 触发另一个步骤或另一个作业/脚本
  • 此步骤/作业/脚本根据需要删除(行或完整表)
于 2012-01-11T11:43:02.683 回答
1

您是否考虑过使用工作级别的事务性?

Spring Batch 中的作业级事务性

重要的是要考虑您正在管理的潜在卷大小,以避免超出限制的提交或回滚

于 2012-10-24T06:33:42.253 回答
-1

在Step 1之前放置BEGIN语句,在Step 2之后放置COMMIT语句。

于 2012-01-11T11:04:32.117 回答