Spring-boot mongodb解决异常251

Gab*_*ido 6 exception mongodb mongodb-query spring-boot

我正在开发一个连接到 mongo db 数据库的 Spring Boot 应用程序。

我不知道为什么,但有时会出现以下错误:

org.springframework.data.mongodb.MongoTransactionException:查询失败,错误代码 251 和错误消息“给定的事务号 1 与任何正在进行的事务不匹配。” 服务器 <> 上的活动交易编号为 -1';嵌套异常是 com.mongodb.MongoQueryException:查询失败,错误代码 251 和错误消息“给定事务号 1 与任何正在进行的事务不匹配。” 服务器 <> 上的活动交易编号为 -1'。

我尝试阅读更多有关此问题的信息,但找不到太多信息。我发现有时这是由于事务管理器的超时问题造成的,但我只是在收到请求时收到错误。正如您在以下日志中看到的

我在 2021-06-29 13:41:14,054 发送请求,并在 2021-06-29 13:41:14,061 收到错误,仅 10 毫秒后。

我有以下配置:

@Configuration
public class SpringMongoconfig {

  @Autowired private MongoDatabaseFactory mongoDbFactory;

  @Autowired private MongoMappingContext mongoMappingContext;

  public @Bean MongoTemplate mongoTemplate() {

    // remove _class
    DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory);
    MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
    converter.setTypeMapper(new DefaultMongoTypeMapper(null));

    return new MongoTemplate(mongoDbFactory, converter);
  }

  @Bean
  MongoTransactionManager txManager(MongoDatabaseFactory dbFactory) {
    return new MongoTransactionManager(dbFactory);
  }
}
Run Code Online (Sandbox Code Playgroud)

它只是有时发生,因为如果我发起相同的请求,它会很好地工作

我的 ddbb 处于副本模式。

有人能帮我吗?

提前致谢。

小智 0

确保事务中对 Mongodb 的第一个请求不会与该事务中的任何其他请求并行完成。我们在一个项目中也遇到了类似的错误。在花了很多时间之后,我们得出了这个假设。对于 Spring Mongo 事务,实际事务在第一个请求发送到数据库时启动。哪种请求 - 查找、查询、更新、保存等并不重要。因此,当第一个请求与任何其他请求并行发送,但无法在它们之前完成时,它们认为事务已经完成开始(但还没有),然后我们看到这个错误发生。“交易x+1不存在。最后一笔交易是x”。

为了修复此错误,我们对流程进行了更改,以便当向 MongoDB 发出第一个请求时,不会有并行的数据库调用。