Spring batch 带有MongoDB和事务的Spring批处理

Spring batch 带有MongoDB和事务的Spring批处理,spring-batch,Spring Batch,我有一个带有两个数据库的Spring Batch应用程序:一个用于Spring Batch元数据的SQL DB,另一个是存储所有业务数据的MongoDB。关系数据库仍然使用数据源TransactionManager。 但是,我不认为Mongo写入是在具有回滚的活动事务中完成的。以下是MongoItemWriter上的摘录: 一种ItemWriter实现,它使用Spring数据的MongoOperations实现写入MongoDB存储。由于MongoDB不是事务性存储,因此尽最大努力在最后时刻持久

我有一个带有两个数据库的Spring Batch应用程序:一个用于Spring Batch元数据的SQL DB,另一个是存储所有业务数据的MongoDB。关系数据库仍然使用
数据源TransactionManager
。 但是,我不认为Mongo写入是在具有回滚的活动事务中完成的。以下是MongoItemWriter上的摘录:

一种ItemWriter实现,它使用Spring数据的MongoOperations实现写入MongoDB存储。由于MongoDB不是事务性存储,因此尽最大努力在最后时刻持久保存书面数据,但仍然遵守作业状态契约。如果在写入过程中发生错误,则不会尝试回滚

但情况已不是这样了,; 如何将事务添加到写入中?当我使用
ItemWriterAdapter
时,我可以在我的服务方法上使用
@Transactional
。但仍然不知道如何处理
MongoItemWriter
。。。这里的正确配置是什么?多谢各位

我有一个带有两个数据库的Spring Batch应用程序:一个用于Spring Batch元数据的SQL DB,另一个是存储所有业务数据的MongoDB

我邀请您查看以下帖子,以了解此设计选择的含义:

在您的情况下,您有一个跨两个数据源的分布式事务:

  • 作业存储库的SQL数据源,由
    DataSourceTransactionManager
  • 步骤的MongoDB(使用
    MongoItemWriter
    ),该步骤由
    MongoTransactionManager
如果希望在同一分布式事务的范围内提交/回滚技术元数据和业务数据,则需要使用协调
DataSourceTransactionManager
mongortransactionmanager
JtaTransactionManager
。您可以在此处找到有关此问题的一些资源:


顺便说一句,在Spring批处理中有一个将MongoDB用作作业存储库的功能请求:。实现此功能后,您可以将业务数据和技术元数据存储在同一数据源中(因此不再需要分布式事务),并且可以对作业存储库和步骤使用相同的
MongoTransactionManager

感谢您花时间,@Mahmoud。您是否对该功能的预计到达时间有粗略估计?谢谢。不,但是我们可以考虑下一个主要版本V5(我们还没有确定日期)。但与此同时,您应该能够通过JTA事务管理器实现您所期望的目标。