使用多个存储库时事务不工作

Transaction not working when using multiple repository

提问人:zellcorp 提问时间:10/26/2023 最后编辑:zellcorp 更新时间:10/26/2023 访问量:28

问:

我尝试在同一事务中保存 2 个文档。 但是,当在第一个 save() 之后抛出异常时,第一个文档仍会被保存。 好像根本没有交易。

我使用 MongoDB Atlas,版本 6.0.11

这里我的服务:

@Service
@RequiredArgsConstructor
public class ApiService {

    private final FirstRepository firstRepository;
    private final SecondRepository secondRepository;

    @Transactional
    public Mono<SecondDocument> save(FirstDocument firstDocument, SecondDocument secondDocument) {
        firstRepository.save().subscribe();
        if(true) {
            throw new RuntimeException("test");
        }
        return secondRepository.save(secondDocument);
    }
}

和我的 mongo 的配置类:

@Configuration
@EnableTransactionManagement
public class MongoReactiveConfig extends AbstractReactiveMongoConfiguration {

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

    @Override
    public MongoClient reactiveMongoClient() {
        return MongoClients.create("mongodb+srv://user:password@url/db&replicaSet=replicaSet");
    }

    @Override
    protected String getDatabaseName() {
        return "database";
    }
}

和我的Spring Boot应用程序:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class ApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiApplication.class, args);
    }
}

谁能帮我理解为什么第一个文档仍然保存?

spring-boot spring-webflux 事务 spring-data-mongodb-反应式

评论

0赞 Igor Artamonov 10/26/2023
我不确定 Reactor 如何工作,但我认为 Spring 不知道第一个订阅,因为它不是生成的 Publisher 的一部分,因此它无法通过事务处理/转换它@Transactional
0赞 zellcorp 11/1/2023
对不起,我花时间测试并试图了解反应堆的工作原理,无论如何,我对反应式开发还是新手。谢谢你@IgorArtamonov,你是对的。我没有找到事务的确切工作方式,但将我所有的发布者“合并”到最终的发布者中解决了我的问题。

答: 暂无答案