当前位置: 首页 > 知识库问答 >
问题:

WebFlux Spring Boot@与反应式MongoDB的事务性

孟茂学
2023-03-14

WebFlux Spring Boot事务性注释是否适用于反应式MongoDB?

我将WebFlux Spring Boot与反应式MongoDB配合使用,如:

    id 'org.springframework.boot' version '2.6.7'
    ...
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
    ...

我标记了我的一个方法@Transactional进行测试。但似乎注释对我不起作用。如果此方法内部发生错误,那么它仍然会向我的mongoDB数据库添加原始数据。

      import org.springframework.transaction.annotation.Transactional;

      ...

      @Transactional
      public Mono<Chat> createChat(Chat chat) {
        return chatRepository
            .save(chat)
            .map(
                c-> {
                  if (true) {
                    throw new RuntimeException();
                  }
                  return c;
                });
      }

我是否错过了一些东西,或者Spring Boot事务性注释无法与反应式MongoDB配合使用?

我使用MongoDB v5.0.8

共有1个答案

阎德宇
2023-03-14

反应式MongoDB的Spring数据似乎需要显式设置一个特殊的bean,即transactionManager。当我将这个bean添加到反应式MongoDB的配置中后,事务性注释就开始工作了。因此,如果方法内部发生错误,我问题中发布的示例方法不再向数据库添加新的raw。

下面是我对transactionManager bean的配置:

@Configuration
@EnableReactiveMongoRepositories
@AllArgsConstructor
public class ReactiveMongoConfiguration extends AbstractReactiveMongoConfiguration {

  private final MongoProperties mongoProperties;

  @Override
  public MongoClient reactiveMongoClient() {
    return MongoClients.create();
  }

  @Override
  protected String getDatabaseName() {
    return mongoProperties.getDatabase();
  }

  @Bean
  ReactiveMongoTransactionManager transactionManager(ReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory) {
    return new ReactiveMongoTransactionManager(reactiveMongoDatabaseFactory);
  }

P、 事实证明,定义transactionManager bean不足以在反应式MongoDB中启用事务。MongoDB的服务器也应该配置复制。我遵循这些步骤,这对我很有效。

 类似资料:
  • 我开始更多地接受反应式编程,并试图将其应用于我的典型业务问题。我经常使用的一种模式是数据库驱动类。我有一些已定义的单元类,如ActionProfile,其实例由ActionProfileManager管理,它从数据库表中创建实例并将其存储在映射中 然而,如果我想让它更具反应性,那么创建地图会打破单子。我可以做的一种方法是将映射本身设置为可观察的,并返回一个monad来为客户端查找特定的键。然而,中

  • 反应式编程与在事件监听器(鼠标、键)中调用函数有何不同,因为两者都是异步事件流,那么反应式编程相对于传统事件监听器调用有何优势?

  • 我想在我的反应式sql客户端事务中使用Kotlin协程。为了简单起见,我打算使用提供的助手函数<code>io.vertx.mutiny.sqlclient。此处文档中提到的池#withTransaction。由于传递的函数不是协程挂起函数,因此当我试图编译以下代码时,我得到了一个类似<code>的错误:挂起函数只能在协程体中调用 withTransaction的函数头如下所示 我问自己,是否还有

  • 导航异步、非阻塞和反应性是一项非常有用的工作。。。给定2个非阻塞、无功、垂直。基于x/quarkus的微服务A和B,其中约束条件是A必须通过http与B通信。如果我想让服务保持被动(非阻塞): 我应该使用Vertex web客户端吗?文档说明它是一个异步客户机,但我假设它是vert。基于x的它也是非阻塞的吗?(我在这里区分异步和非阻塞) 任何帮助都会很好。谢谢

  • 最近在学微服务的分布式事务,不太明白为什么在微服务这种分布式系统中,原有的单体acid会出现问题 希望大佬们可以讲一下原理和思想

  • 我试图在Spring Boot中使用MongoDB反应性模板以反应式方式获得更新结果。 问题是更新部分不会执行,因为我没有订阅它,但我真的不知道如何使用反应性范式执行这两个操作并返回一个值。 这就是我正在尝试的: flatMap updateFirst不会发生,因为我没有订阅,但我需要返回UpdateResult,如果我订阅了,我不知道如何返回该值。