Spring 批处理多个数据源和 ChainedTransactionManager 风险

Spring Batch multiple datasources and ChainedTransactionManager risks

我正在研究 Spring 由两个数据源组成的批处理的可行性。 Spring 批处理元数据的 SQL 数据源和业务数据的 MongoDB 数据源(具有事务用途)。交易方面在这里提出了几个问题。

以下主题: 和相关资源为我的问题提供了一些答案。 答案提到使用Spring的JtaTransactionManager来管理两个数据源上的分布式事务。 该技术使用 2PC 协议。如果我理解正确的话,它也是最可靠的解决方案。 https://www.infoworld.com/article/2077963/distributed-transactions-in-spring--with-and-without-xa.html?page=2

另一方面,我找到了一些关于 Spring 的 ChainedTransactionManager 的资源。该技术使用尽力而为 1PC 协议。这个解决方案不太健壮,如果我理解正确的话,如果基础设施出现问题(例如网络故障),系统可能会处于不一致的状态。 ChainedTransactionManager 的优点是更容易实现并提供更好的性能。我看到它已被弃用 https://github.com/spring-projects/spring-data-commons/issues/2232.

在 Spring 批次中使用 ChainedTransactionManager 的具体风险是什么?万一出错,我的Spring批量元数据和Mongo中的业务数据是否不一致? 我想还有重试或块跳过策略需要考虑的因素?

非常感谢您的帮助。

In case of an error, can I have inconsistencies between the Spring batch metadata and the business data in Mongo?

是的,这是您应该注意的风险。

避免这种情况的常用技术是禁用状态管理并使用 process indicator pattern. You can find an example here