WebFlux Spring 使用反应式启动 @Transactional MongoDB

WebFlux Spring Boot @Transactional with reactive MongoDB

WebFlux Spring Boot @Transactional 注释是否与反应式 MongoDB 一起工作?

我使用 WebFlux Spring 使用反应式启动 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 引导 @Transactional 注释不适用于响应式 MongoDB?

我用的是MongoDBv5.0.8

似乎 Spring 响应式数据 MongoDB 需要明确设置一个特殊的 bean transactionManager。一旦我将这个 bean 添加到我的响应式 MongoDB 配置中,@Transactional 注释就开始工作了。因此,如果方法内部发生错误,我的问题中发布的示例方法不会再向数据库添加新的原始数据。

这是我使用 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.S。 事实证明 transactionManager bean 的定义不足以启用反应式 MongoDB 中的事务。 MongoDB 的服务器也应该配置为 replication。我遵循了这些 ,它对我有用。