2017-04-11 1 views
0

ich meine Anwendung, wenn Benutzer versuchen, die Daten, die er von der Form eingeben anmeldet und wird in zwei verschiedene DokumentWird dies als eine Transaktion in Mongodb betrachtet?

 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; 


} 
gespeichert

mein Problem ist, wenn etwas schief gelaufen ist zwischen dem ersten Schreib und die zweite Schreib es möglich ist, Daten haben eingegeben im ersten dokument und das zweite dokument ist leer, also wird diese situation als transaktion betrachtet, wenn ja, wie sollte ich vermeiden, dass ich darüber nachdenke, den anmeldeprozess zu ändern oder sollte ich eine andere option wie zwei phase commit in betracht ziehen.

Antwort

0

Wenn Sie die Atomarität zwischen "Benutzer" - und "Schul" -Sammlungen sicherstellen möchten, können Sie dies in MongoDB nicht sicherstellen, da Transaktionen nicht unterstützt werden. Sie müssen das Design Ihrer Mongo-Sammlungen überdenken und das Schulobjekt in Ihr Benutzerobjekt einbetten, da MongoDB die Atomizität auf Dokumentebene gewährleistet. Etwas wie folgt aus:

{"userName":"[email protected]","school":{"name":"xyz","city":"ny"}} 

oder MongoDB bietet „Transaktion wie“ Semantik mit Hilfe von zwei Phase verpflichtet: https://docs.mongodb.com/manual/tutorial/perform-two-phase-commits/

+0

ich die Schule Objekt nicht einbetten können, weil Benutzer unterschiedliche Rollen haben .user ein Lehrer oder Schüler sein kann i Ich dachte darüber nach, die Anmeldeseite zu ändern, so dass ich zunächst nur Daten zur Benutzersammlung erhalte und nach der Anmeldung abhängig von den Rollen andere Daten erhalte, ist es der richtige Ansatz, dies zu tun? – ashutosh

Verwandte Themen