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
。我遵循了这些 ,它对我有用。
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
。我遵循了这些