当前位置: 首页 > 知识库问答 >
问题:

Spring@transactional与MongoDB一起工作吗?

田硕
2023-03-14

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

我添加了注释,看起来一切都正常运行(应用程序运行,我可以执行CRUD的所有操作),但是,我不知道Spring是否忽略了注释,它是否正常工作,或者是否真的在考虑事务性。

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

共有2个答案

柳修为
2023-03-14

对于反应式风格mongoDB

张溪叠
2023-03-14

@事务性仅适用于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是否忽略了注释并照常工作,或者真的在考虑事务性

为此,您可以在2个DB更新之间抛出异常,并检查第一个更新是否已回滚。

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

在MongoDB中,写入操作在单个文档级别上是原子的,即使该操作修改单个文档中的多个嵌入文档也是如此。MongoDb文档-事务

 类似资料:
  • 我之前有一个关于这个问题的帖子已经解决了。然而,自从用自动连线bean和较少的XML配置重建项目后,我发现我正在重新考虑这个问题。我遵循了我以前的项目实现这一点的方式,但它不起作用。有人能帮助我为什么或者我应该改变什么来使它工作吗? 注册服务: 注册DAO:

  • 我有一个spring webapp,一切都很好,但现在我需要一个事务性方法, 这是我的应用程序上下文。xml 这是我的数据库。xml 在一个服务类中,我有一个autowired属性,这个属性有一个这样的事务方法:我进行更新,将一行值更改为“2”,然后在抛出RuntimeException之后,如果一切正常,则必须回滚更新。 两天前,我尝试了很多可能的解决方案,我在google和stackoverf

  • pom.xml版本信息: SpringFox-Swagger2:2.5.0 昂首阔步-核心:1.5.10 springfox-swagger-ui:2.6.1 Springboot:1.5.3 我有一个项目与swagger2和Springboot。 没有@Aspect的项目代码工作得很好。 正确的结果: 但是当我添加以下代码时,swagger-ui没有显示test-api-impl。 swagge

  • Spring对RDBMS事务管理的支持在Spring WebFlux中也起作用吗? 例如,假设配置正确,用注释注释的方法是否会使用Spring事务管理器并在发生错误时回滚事务? 如果事务管理确实起作用,那么方法是否确实和异常,或者或返回类型是否发出错误信号? 我知道JDBC本质上是阻塞的,因此任何JDBC操作都必须从阻塞桥接到反应桥接,反之亦然。 我的组织有WebFlux和Cassandra的经验

  • 我使用的是Spring批处理版本2.2.4.Release,我试图用有状态的ItemReader、ItemProcessor和ItemWriter bean编写一个简单的示例。 在我的集成测试中,我在一个内部静态java配置类中声明bean,如下所示: 这个测试通过了。 但是,一旦我将StatefulItemReader定义为step范围的bean(这对于有状态的读取器更好),“Before st

  • 我想知道我是否能做这样的事情。假设我有一个数字流1-20。我想利用一个特性,比如drop 3(我想用Java术语来说是限制还是跳过?)并产生一个流,即数字流: 1-20、4-20、7-20等 然后可能平坦地将这些全部映射到一条溪流中。我尝试了使用Stream.iterate的各种组合,主要是从流生成流,但我一直收到一个IllegalStateExcema,说流已经操作或关闭。 例如,人们可能期望这