繁体   English   中英

WebFlux Spring Boot @Transactional 与反应式 MongoDB

[英]WebFlux Spring Boot @Transactional with reactive MongoDB

WebFlux Spring Boot @Transactional注释是否适用于反应式 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 @Transactional注释不适用于反应式 MongoDB?

我使用 MongoDB v5.0.8

似乎响应式 MongoDB 的 Spring Data 需要显式设置一个特殊的 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);
  }

PS 事实证明, transactionManager bean 的定义不足以在反应式 MongoDB 中启用事务。 MongoDB 的服务器也应该配置replication 我遵循了这些步骤,它对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM