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

使用@transactional annotation的Spring Boot事务支持不适用于mongoDB,有没有解决方案?

邵胜涝
2023-03-14

Spring Boot版本-2.4.4,mongodb版本-4.4.4

在我的项目中,我想在mongodb的两个不同文档中进行输入,但如果其中一个文档失败,则应该进行回滚。mongodb支持4.0版之后的事务,但前提是您至少有一个副本集。

在我的情况下,我没有副本集,也无法根据我的项目结构创建副本集。我不能使用mongodb的事务支持,因为没有副本集。所以,我使用Spring事务。

根据Spring文档,要在Spring Boot中使用事务,您只需要使用@transactional注释,一切都会正常工作(即回滚或提交)。我尝试了许多来源的许多东西,但如果一个失败,它就不是回滚事务。

演示代码在这里,这是演示代码,不是实际的项目。这是我的服务课。

@Service
public class UserService {
  @Autowired
  UserRepository userRepository;

  @Autowired
  UserDetailRepository userDetailRepository;

  @Transactional(rollbackFor = Exception.class)
  public ResponseEntity<JsonNode> createUser(SaveUserDetailRequest saveUserDetailRequest) {

   try {
       User _user = userRepository.save(new User(saveUserDetailRequest.getId(), saveUserDetailRequest.getFirstName(), saveUserDetailRequest.getLastName()));

       UserDetail _user_detail = userDetailRepository.save(new UserDetail(saveUserDetailRequest.getPhone(), saveUserDetailRequest.getAddress()));

       } catch (Exception m) {
      System.out.print("Mongo Exception");
  }
    return new ResponseEntity<>(HttpStatus.OK); 

 }
}

也尝试了以下代码,但仍然不起作用,

@EnableTransactionManagement
@Configuration
@EnableMongoRepositories({ "com.test.transaction.repository" })
@ComponentScan({"com.test.transaction.service"})
public class Config extends AbstractMongoClientConfiguration{

  private com.mongodb.MongoClient mongoClient;

  @Bean
   MongoTransactionManager transactionManager(MongoDbFactory dbFactory) {
       return new MongoTransactionManager(dbFactory);
   }
  @Bean
  public com.mongodb.MongoClient mongodbClient() {
    mongoClient = new com.mongodb.MongoClient("mongodb://localhost:27017");
    return mongoClient;
}

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

共有1个答案

施默
2023-03-14

Spring中的事务支持只是为了让事情变得更容易,它并没有取代对正在使用的底层数据存储的事务支持。

在这种情况下,它将简单地将事务的启动/提交委托给MongoDB。当使用数据库时,它最终会委托给数据库等。

在这种情况下,MongoDB的先决条件仍然需要得到满足,您仍然需要一个副本。

 类似资料:
  • Hibernate会支持MongoDB事务吗? MongoDB4.0增加了对多文档ACID事务的支持。但是Hibernate仍然不支持这一点,我不能简单地使用@transactional(Grails framework)注释为MongoDB操作添加事务性行为。我得自己写事务性管理代码。有没有人有更好的解决方案或者什么时候Hibernate支持它?谢谢! 引自Hibernate:MongoDB不支

  • 据我所知,当您尝试在提交前一个事务之前开始一个事务时,会发生这种异常。然而,我不明白为什么在我的情况下会有这种例外。 我有一个Web应用程序与以下servlet: 这是我的Compte对象: 这是我的DAO的接口: 这就是它的实施: 另外,这是我的Spring配置: 关联的应用程序。属性文件包含以下行: 最后,我有以下servlet过滤器,从这里开始事务: 这是在网络上映射的。如下所示的xml文件

  • 问题内容: 我试图在我的Python编程中使用一些AOP,但是我对现有的各种库没有任何经验。 所以我的问题是: Python有哪些AOP支持?两者之间的差异库有什么优势? 编辑 我找到了一些,但我不知道它们的比较: Aspyct 适用于Python的轻量级AOP 编辑2 我将在哪种情况下使用这些? 我有两个用Python编写的应用程序,它们通常具有计算税金和其他金钱事物的方法。我希望能够编写功能的

  • 这是我给管理员的yaml: 这是我给mongoDB的名字 所以我的问题是,我无法登录mongod,因为我从Adminer获得了这个信息:Adminer不支持在没有密码的情况下访问数据库。这个问题有没有简单的解决方法,我可以登录到我的mongod?还有,我经营库伯尼特斯

  • 似乎没有使用Hikaricp。 例如,Spring。数据源。始终影响最大池大小。Spring数据源。希卡里。最大池大小不受影响。 我设定如下: 然后我通过netstat命令检查连接数。有10个连接。似乎hikari的最大池大小不起作用。即使我删除了spring.datasource.maximum池大小,hikari的最大池大小仍然不起作用。 此外,我设置了以下日志事件,但没有关于HikariCP

  • 我们继续上一章节的内容,大家应该记得我们 Lua 代码中是如何完成 ngx_postgres 模块调用的。我们把他简单改造一下,让他更接近真实代码。 local json = require "cjson" function db_exec(sql_str) local res = ngx.location.capture('/postgres',