SpringData事务管理器支持MongoDB多数据库事务

问题描述

我在一个Mongo集群(版本4.4)中有两个数据库数据库的一种是数据的暂存区,即存储在其中的数据是临时的,丰富的,经过验证的,等等。在某些时候,必须将数据复制到永久db并标记为在temp db中复制。我想一次完成这些操作。

根据this blog post,使用mongo专用代码应该非常容易。 但是我的应用程序的其余部分是在SpringData之上编写的(来自spring-data-mongodb-3.0.2.RELEASE.jar的MongoTemplate)。所以我也想在这种情况下使用它。

可以在Spring配置中定义事务管理器bean并使用它:

  @Bean
  MongoTransactionManager transactionManager(MongoDbFactory dbFactory) {
    return new MongoTransactionManager(dbFactory);
  }

但是该bean将被绑定到单个Mongo数据库(在dbFactory中指定),因此在实践中,事务将仅包含与一个DB相关的操作(而不是两个数据库)。

我找到了一种定义ChainedTransactionManager并将两个PlatformTransactionManagers作为参数传递的方法。但是据我了解,它将创建两个事务,并且如果先前失败,则会回滚剩余的事务。 那不是我想要的。

官方Spring data docs未提供可与MongoTemaplate一起使用的本机跨数据库Mongo交易的任何信息。

所以我的问题是: 是否可以定义一个事务管理器来支持多个MongoDb数据库(并允许在一个事务中修改两个数据库中的数据)?

解决方法

实现此目的的一种可能方法是在处理代码之外建立事务(使用withTransaction驱动程序帮助程序),该事务为您提供一个会话对象,并使所有处理代码都引用该事务的会话。然后,您的处理代码只需要使用会话,而无需担心事务,它可以与其他组件一起成为事务的一部分。

不过,我不知道该如何专门针对spring数据。