Это считается транзакцией в mongodb?
В моем приложении, когда пользователь пытается зарегистрироваться, данные, которые он вводит из формы, сохраняются в двух разных документах.
public Result schoolSignUp(FormSchoolSignUp signUpForm){
User userEntered=null;
if(signUpForm.getEmail()!=null){
User user=this.userService.getUser(signUpForm.getEmail());
// user null means there is no user in data base
if(user==null){
List<String> roles=new ArrayList<>();
roles.add("ROLE_SCHOOL");
// data is assigned to user
this.user.setUserName(signUpForm.getEmail());
this.user.setPassword(signUpForm.getPassword());
this.user.setRoles(roles);
//user collection data is stored in the data base
userEntered=this.userService.saveUser(this.user); // first
write operation
}
else{
this.result.setResult(false);
this.result.setMessage("User Already Exist");
}
}
else{
this.result.setResult(false);
this.result.setMessage("User Name is not entered");
}
if(userEntered!=null){
// data is assigned to school
this.school.setName(signUpForm.getName());
this.school.setUserId(signUpForm.getEmail());
this.school.setUserId(userEntered.getUserName());
this.school.setAddress(signUpForm.getAddress());
this.school.setState(signUpForm.getState());
this.school.setCity(signUpForm.getCity());
//school collection is stored in the data base
this.schoolRepository.insert(this.school);//second write
operation
this.result.setResult(true);
this.result.setMessage("Success");
}
return this.result;
}
Моя проблема заключается в том, что если что-то пошло не так между первой записью и второй записью, возможно, что данные будут введены в первый документ, а второй документ пуст, поэтому эта ситуация будет рассматриваться как транзакция, если так, как мне следует избегать, я думаю об изменении процесс регистрации или я должен рассмотреть какой-то другой вариант, как двухфазное принятие.
1 ответ
Если вы хотите обеспечить атомарность между "пользовательскими" и "школьными" коллекциями, то нет никакого способа гарантировать это в MongoDB, так как он не поддерживает транзакции. Вам нужно переосмыслить дизайн своих коллекций Монго и встроить школьный объект в свой пользовательский объект, так как MongoDB обеспечивает атомарность на уровне документа. Что-то вроде этого:
{"userName":"xyz@abc.com","school":{"name":"xyz","city":"ny"}}
Или MongoDB предлагает семантику "транзакции как" с использованием двухфазных фиксаций: https://docs.mongodb.com/manual/tutorial/perform-two-phase-commits/