Spring @transactional 是不是与 MongoDB 一起使用?

Posted

技术标签:

【中文标题】Spring @transactional 是不是与 MongoDB 一起使用?【英文标题】:does Spring @transactional work with MongoDB?Spring @transactional 是否与 MongoDB 一起使用? 【发布时间】:2019-07-31 21:37:26 【问题描述】:

我正在使用 Spring Boot 和 MongoDB 开发一个 Web 应用程序。我想让服务与@transactional spring 注释一起工作,但我不知道这是否真的有效。 (我之前没有使用过 mongoDB)。

我添加了注释,似乎一切运行良好(应用程序运行,我可以执行所有操作 CRUD),但是,我不知道 Spring 是否忽略了注释并且它像往常一样工作,或者真的考虑事务性。

在其他帖子中,我看到我应该在配置类中添加一个新 bean,以启用 Spring 和 MongoDB 之间的事务性。真的有必要吗?我只对单个Mongo文档使用事务。

【问题讨论】:

Spring Data MongoDB Reference manual, §12.2: Transactions with MongoTransactionManager (external link) @Turing85 不适用于弹簧靴。如果我创建 bean transactionManager,我无法导入类型 MongoTransactionManager。这种类型在“spring-data-mongodb”库中,而我使用的是“spring-boot-starter-data-mongodb”。如果我将第一个依赖项添加到项目中,则会出现 ClassNotFoundException。 【参考方案1】:

@Transactional 仅适用于 spring-data-mongodb 2.1.0 及更高版本: https://docs.spring.io/spring-data/mongodb/docs/2.1.0.RELEASE/api/

确实你必须添加 bean:

@Bean
MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) 
    return new MongoTransactionManager(dbFactory);

我不知道 Spring 是否忽略了注解并照常工作,还是真的在考虑事务性

为此,您可以在两次数据库更新之间抛出异常并检查第一次更新是否已回滚。

但如果您在单个 Mongo 文档中使用事务,则不需要 @Transactional 注释:

在 MongoDB 中,写入操作在单个级别上是原子的 文档,即使操作修改了多个嵌入文档 在单个文档中。 MongoDb documentation - Transactions

【讨论】:

我推荐 ArithmeticException: / 零,在 2 db 插入之间。它可以检查回滚操作。 MongoDbFactory 已弃用,现在使用 MongoDatabaseFactory【参考方案2】:

对于反应式 mongoDB 和 Spring boot 集成,我提供的答案 here 可能对人们有用

【讨论】:

以上是关于Spring @transactional 是不是与 MongoDB 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

聊一聊Spring中的 Transaction基本实现

你知道@Transactional注解的失效场景吗?

Spring @Transactional原理

Spring + Jboss7 @Transactional 不工作

Spring中@Transactional(readOnly = false)的作用是啥?

如果没有AspectJ,Spring中如何使用SpringAOP@Transactional?