【发布时间】: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