使用@transactional注释的Spring Boot Transaction支持不适用于mongoDB,有人对此



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

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

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

根据spring-docs的说法,要在spring-Boot中使用transaction,只需要使用@transactional annotation,一切都会正常工作(即回滚或提交(。我尝试了许多来源的东西,但如果一个失败了,它并不是回滚事务。

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

@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";
}
}

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

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

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

相关内容

最新更新