UserA et UserB changent objectA.filedA objectA.filedB respectivement et en même temps. Parce qu'ils ne changent pas le même champ, on pourrait penser qu'il n'y a pas de chevauchement. Est-ce vrai? ou l'implémentation de pm.makePersistnace() remplace réellement l'objet entier ... bon à savoir ...GAE mettre à jour différents champs de la même entité
Répondre
Est-ce que c'est ce que vous envisagez de passer?
- Alice récupère l'objet. {a = 1, b = "Foo"}
- Bob récupère l'objet. {a = 1, b = "Foo"}
- Alice modifie l'objet, en changeant b. {a = 1, b = "Bar"}
- Bob modifie l'objet, en changeant a. {a = 2, b = "Foo"}
- Alice conserve sa copie de l'objet. {a = 1, b = "Bar"}
- Bob conserve sa copie de l'objet. {A = 2, b = « Foo »}
la copie de Bob de l'objet remplacera la copie dans le datastore, parce qu'il est persistant son objet entier, non seulement son ensemble de champs modifiés. Ou, en général, celui qui persiste le dernier a son objet entier persisté dans le magasin de données.
Vous pouvez résoudre ce problème en exécutant chacune de leurs opérations get-set-and-persistent dans une transaction. Les transactions App Engine n'empêchent pas l'extraction ou la modification de l'intégralité de l'objet localement, elles empêchent simplement la persistance d'autres utilisateurs. Donc:
- Alice récupère l'objet dans une transaction. {a = 1, b = "Foo"}
- Bob récupère l'objet dans une transaction. {a = 1, b = "Foo"}
- Alice modifie l'objet, en changeant b. {a = 1, b = "Bar"}
- Bob modifie l'objet, en changeant a. {a = 2, b = "Foo"}
- Alice essaie de persister l'objet, mais ne peut pas, car Bob l'a ouvert dans une transaction. Une exception sera levée, qu'Alice attrapera en terminant sa transcation et en réessayant ...
- Bob persiste l'objet, sans problème, car Alice a terminé sa transaction {a = 2, b = "Foo"}
- Alice réessaie sa transaction en la récupérant à nouveau. {a = 2, b = "Foo"}
- Alice modifie l'objet, en changeant b. {a = 2, b = "Bar"}
- Alice persiste l'objet, et cela fonctionne parce que personne d'autre n'a une transaction ouverte. {a = 2, b = "Bar"}
Je ne suis pas absolument sûr quel utilisateur obtiendra l'exception, mais tant qu'ils seront prêts à réessayer quand ils le verront, ils seront à la fois capable de faire leurs changements à l'objet et les persister, finalement. Ce numéro est appelé Optimistic Locking.
Merci pour votre réponse. Dommage que l'implémentation de makePersistence() consiste à écrire l'objet WHOLE dans la banque de données et pas seulement dans les champs qui ont été modifiés. Ce fait oblige réellement toute mise à jour d'objet partagé dans GAE pour utiliser une transaction en tant que règle. En outre plus - dans de tels cas, vous devez implémenter le "mécanisme de tentative" comme une exception dans la transaction peut se produire.
Alors ... mettre à jour un objet partagé GAE doit toujours avoir ces extras:
- le faire dans une transaction
- mettre en place un mécanisme de nouvelle tentative
La plupart des exemples de Google dans leur site ne sont en fait pas en tenir compte. Comme s'ils sont en supposant que la plupart des applications ne seront pas utilisées objets partagés
Par exemple (http://code.google.com/appengine/docs/java/datastore/creatinggettinganddeletingdata.html):
public void updateEmployeeTitle(User user, String newTitle) {
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
Employee e = pm.getObjectById(Employee.class, user.getEmail());
if (titleChangeIsAuthorized(e, newTitle) {
e.setTitle(newTitle);
} else {
throw new UnauthorizedTitleChangeException(e, newTitle);
}
} finally {
pm.close();
}
}
OU:
public void updateEmployeeTitle(Employee e, String newTitle) {
if (titleChangeIsAuthorized(e, newTitle) {
e.setTitle(newTitle);
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
pm.makePersistent(e);
} finally {
pm.close();
}
} else {
throw new UnauthorizedTitleChangeException(e, newTitle);
}
}
Ils ne gèrent pas non plus 'OverQuotaException's ou' CapabilityDisabledException's, mais c'est probablement juste parce que cela rendrait l'exemple trop complexe pour être utile. Et la vérité est, la plupart des applications n'auront jamais ces problèmes parce que la plupart des applications ne seront pas si fortement utilisées que les modifications simultanées sont un problème. Certaines applications n'éditent même pas du tout les entités existantes, seulement les créent et les affichent. Votre application semble être celle qui doit en tenir compte, c'est donc une bonne chose que vous l'ayez examiné. –
Aussi, ce n'est généralement pas une bonne idée de répondre à votre propre question avec une discussion sur la question. C'est ce que les commentaires sont pour, soit sur votre question, ou sur la réponse. –
mais le code n'apparaît pas bien et difficile à lire – bach
- 1. Comment mettre à jour une entité de relation à plusieurs depuis la même vue?
- 2. Comment mettre à jour automatiquement une entité lorsqu'une entité est conservée ou mis à jour
- 3. vba comment mettre à jour des champs
- 4. Mettre à jour le modèle de données Entité commerciale
- 5. Comment puis-je mettre à jour la même ligne dans plusieurs fichiers différents?
- 6. Entité de mise à jour EF4 sans première entité
- 7. Besoin de mettre à jour la clé primaire sur les objets existants dans GAE Java
- 8. Comment mettre à jour des objets entité sans les supprimer?
- 9. Comment savoir qu'une entité va insérer ou mettre à jour
- 10. NHibernate Cartographie Entité de champs dans une même table
- 11. Entity framework 4 POCO comment mettre à jour une entité?
- 12. Comment mettre à jour une entité LINQ existante?
- 13. Comment mettre à jour une entité de nouvelle créée entité détachée
- 14. MySQL - Mettre à jour deux fois la même colonne
- 15. JavaScript Auto suggérer de mettre à jour plusieurs champs
- 16. Wordpress: mettre à jour toutes les valeurs de champs?
- 17. nhibernate session pour différents serveurs de base de données avec la même entité
- 18. En utilisant Hibernate/JPA Event Listener de mettre à jour une entité lorsque d'autres entités sont mises à jour
- 19. Entity Framework: Mettre à jour l'entité lorsqu'une autre entité est mise à jour
- 20. Mise à jour de différents champs selon que les autres champs ont ou non des valeurs
- 21. Mettre 2 champs dans la même colonne dans l'Admin Django?
- 22. Quels champs puis-je mettre à jour dans Oracle?
- 23. Comment mettre à jour des champs spécifiques de classe dans Fluent NHibernate sans mettre à jour l'ensemble de l'objet?
- 24. Mettre à jour tous les champs i18n d'une action
- 25. itérer mysql fileds et mettre à jour les champs
- 26. NHibernate - mappe la même entité à différentes tables dans la même base de données
- 27. Entity Framework champs CreatedBy ne pas mettre à jour
- 28. envoyer la valeur de radiobutton à différents champs à DB
- 29. représentations multiples de la même entité
- 30. Jpa, entité de mise à jour Seam
Vous pourriez vouloir reconsidérer en utilisant « id » et 'nom' - ils sont tous les deux des termes réservés dans App Engine, et ne sont pas modifiables. –
Excellente recommandation. Renommé en a et b. Je vais aussi renommer l'utilisateur A et l'utilisateur B à Alice et Bob, pour éviter encore plus de confusion. –