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

spring batch use different transaction-manager between job-repository and actual tasks

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

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

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

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

也就是说,即使您可以使用两个单独的 t运行saction 管理器,但这并不意味着您应该这样做。如果您不进行 XA,那么想象一下如果业务流程 运行 成功但作业数据未保存会发生什么。下一次批处理 运行,Spring 批处理会认为作业失败,并再次尝试 运行。