【问题标题】:Support of MongoDB multi DB transactions by SpringData transaction managerSpringData事务管理器对MongoDB多DB事务的支持
【发布时间】:2021-01-01 05:39:05
【问题描述】:

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

根据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 数据库的事务管理器(并允许在一个事务中修改两个数据库中的数据)?

【问题讨论】:

    标签: spring mongodb transactions spring-data-mongodb spring-transactions


    【解决方案1】:

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

    不过,我不知道如何专门针对 spring 数据执行此操作。

    【讨论】:

      猜你喜欢
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      相关资源
      最近更新 更多