J'ai un modèle simple de domaine comme suitApp Engine JDO Transaction sur plusieurs many-to-one
Driver - clé (chaîne), exécutez comptage, comptage piste unique
Track - clé (chaîne), exécutez comptage, comptage pilote unique, le meilleur temps
Run - clé(), pilote-clé, piste clé, le temps, booléen-pilote de mise à jour, mise à jour piste booléenne
Je dois pouvoir mettre à jour un Run et un Driver dans la même transaction; ainsi qu'un Run et un Track dans la même transaction (évidemment pour m'assurer que je ne mets pas à jour les statistiques deux fois, ou manquer un compteur d'incrément)
Maintenant j'ai essayé d'assigner comme clé de course, une clé faite up de driver-key/track-key/run-key (chaîne)
Cela me permettra de mettre à jour en une transaction l'entité Run et l'entité Driver. Mais si j'essaie de mettre à jour les entités Run et Track ensemble, il se plaindra qu'il ne peut pas transiter sur plusieurs groupes. Il dit qu'il a à la fois le conducteur et le camion dans la transaction et il ne peut pas fonctionner à la fois ...
tx.begin(); run = pmf.getObjectById(Run.class, runKey); track = pmf.getObjectById(Track.class, trackKey); //This is where it fails; incrementCounters(); updateUpdatedFlags(); tx.commit();
Bizarrement quand je fais une chose semblable à mettre à jour Exécuter et pilote, il fonctionne très bien.
Des suggestions sur la façon dont je peux mapper mon modèle de domaine pour obtenir la même fonctionnalité?
Je suis prêt à faire face à la contention, je n'ai pas besoin des champs de statistiques mis à jour immédiatement, c'est pourquoi j'ai les drapeaux "mis à jour" sur la course elle-même ... ce que je ne peux pas sacrifier est la précision ... – Patrick
comme un peu plus de contexte, j'aurais typiquement beaucoup de pistes et de nombreux pilotes; une entité de pilote ne devrait pas avoir beaucoup de contention, elle n'est accessible que par un utilisateur à la fois, mais une entité de piste serait lue par de nombreux utilisateurs à la fois, et s'exécuterait contre elle. – Patrick
Mise à jour - J'ai enfin terminé ce développement. Le résultat est sur http://www.tRacePerfect.com/. La "Piste" est le "Puzzle" et le "Pilote" est le "Joueur". Comme vous pouvez le voir, diverses statistiques sont maintenues. J'utilise une combinaison de techniques de sharding et de tâches. – Patrick