【问题标题】:Spring Boot Transaction support using @transactional annotation not working with mongoDB, anyone have solution for this?使用 @transactional 注释的 Spring Boot Transaction 支持不适用于 mongoDB,有人有解决方案吗?
【发布时间】:2021-06-22 01:31:17
【问题描述】:

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

在我的项目中,我想在 2 个不同的 mongodb 文档中输入,但如果一个失败,则应该回滚。 mongodb 4.0 以后才支持事务,但前提是你至少有一个副本集。

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

根据 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";
    }
}

【问题讨论】:

  • @Transactional 不会自动使交易生效。如果底层 MongoDB 无法支持事务,@Transactional 将无法工作。因此,您仍然需要一个复制集和所有其他东西才能使事务正常工作。那并且您的代码是错误的,因为您正在捕获异常而不是让它冒泡,因此事务支持可以处理它(尽管如此,由于它无法正常工作与 MongoDB 进行交易时缺少的先决条件)。
  • @M.Deinum 那么,我不能对 Spring 的事务支持做任何事情,这样即使 mongodb 在没有副本集的情况下不支持它,我也可以使用事务行为?
  • 没有。由于 Spring Transaction 支持最终只是简单地委托给 MongoDB。
  • 好的。谢谢你的回答。

标签: spring mongodb spring-boot transactions spring-transactions


【解决方案1】:

Spring 中的事务支持只是为了让事情变得更简单,它不会取代正在使用的底层数据存储的事务支持。

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

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

【讨论】:

    猜你喜欢
    • 2019-12-07
    • 1970-01-01
    • 2019-11-18
    • 2020-04-29
    • 2014-08-31
    • 2011-03-10
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    相关资源
    最近更新 更多