使用@transactional annotation的spring boot事务支持不适用于mongodb,有解决方案吗?

c8ib6hqw  于 2021-07-15  发布在  Java
关注(0)|答案(1)|浏览(267)

spring boot版本-2.4.4,mongodb版本-4.4.4
在我的项目中,我想在mongodb的两个不同的文档中进行输入,但是如果其中一个失败了,那么应该进行回滚。mongodb支持版本4.0之后的事务,但前提是您至少有一个副本集。
在我的情况下,我没有副本集,也不能根据我的项目结构创建它。我不能使用mongodb的事务支持,因为没有副本集。所以,我使用spring事务。
根据spring文档,要在spring boot中使用transaction,只需使用@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";
    }
}
gcuhipw9

gcuhipw91#

spring中的事务支持只是为了让事情变得更简单,它并没有取代对正在使用的底层数据存储的事务支持。
在这种情况下,它只需将事务的启动/提交委托给mongodb。当使用数据库时,它最终将委托给数据库等。
在这种情况下,mongodb的先决条件仍然需要遵守,您仍然需要一个副本。

相关问题