【发布时间】:2019-06-30 13:13:41
【问题描述】:
我有以下两种方法使用Spring data JPA的MongoRepository将单个用户和多个用户存储在mongodb中。如果方法中发生任何异常,则不会回滚。我可以在数据库中找到数据。
@Override
@Transactional(propagation = Propagation.REQUIRED)
public UserRequest save(UserRequest userRequest) throws UserException {
logger.info("Saving the user information {} ", userRequest);
User user = new User(sequenceService.getNextSequenceFor(SequenceNames.USER));
if("admin".equals(userRequest.getFirstName())) {
throw new UserException("Resvered name canot be used : " + userRequest.getFirstName());
}
BeanUtils.copyProperties(userRequest, user,"id");
user = userRepository.save(user);
userRequest.setId(user.getId());
return userRequest;
}
@Override
@Transactional
public List<UserRequest> save(List<UserRequest> users) throws UserException {
for (UserRequest userRequest : users) {
save(userRequest);
}
return users;
}
@Repository
public interface UserRepository extends MongoRepository<User, String> {
}
用户请求:
[
{
"firstName": "John",
"lastName": "A",
"mobileNo": "9898989892",
"emailId": "john.a@gmail.com"
},
{
"firstName": "admin",
"lastName": "A",
"mobileNo": "9898989892",
"emailId": "admin.a@gmail.com"
}
]
此代码将 John 的数据保存在数据库中。它仅对用户 admin 进行回滚。它不会回滚所有用户数据。没有发生部分回滚。
【问题讨论】:
-
调用保存方法的代码在哪里?
-
异常应该是 RuntimeException Spring Transactions 任何 RuntimeException 都会触发回滚,而任何已检查的异常都不会。 要发生回滚,您可以使用
@Transactional(rollbackFor = UserException.class)
标签: spring spring-boot spring-data spring-data-mongodb spring-transactions