Это считается транзакцией в 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/

Другие вопросы по тегам