2012-08-30 1 views
0

Je travaille sur un projet et je suis arrivé à une sorte de "problème de design". J'ai une entité qui représente une "concurrence". Les utilisateurs reçoivent des votes et votent pour le concours. Chaque compétition comporte 10 éléments et seulement 10 votes au total peuvent être attribués à chacun. Quand un utilisateur essaie d'utiliser ses votes, je fais une recherche rapide de concours ouverts sur lesquels il n'a pas encore voté.Réflexions sur les entités concurrentes et les conditions de concurrence dans JPA ... Transactionnel?

Le problème vient quand je pense à plusieurs utilisateurs rivalisant pour la même compétition. Peu importe si deux utilisateurs votent en même temps, mais je veux éviter les erreurs où une compétition est récemment fermée, mais il y a encore des utilisateurs qui votent parce qu'ils ont choisi avant la clôture ... ce que je considère comme un "condition de concurrence" à la fin du vote.

La façon dont je le vois, il y a seulement quelques options:

Option 1: Activer les transactions READ_COMMITTED, mais je crois comprendre que ce bloque la ligne de lecture, donc pas d'autres requêtes terminerez jusqu'à ce que le verrou est retourné. Puisqu'il s'agit d'une application JSP, le verrou en lecture se termine-t-il lorsque le JSP est terminé? On dirait que je pourrais toujours avoir le même problème.

Option 2: Ecrivez combien d'utilisateurs ont consulté la compétition. Cela semble suivre l'anti-pattern de la base de données en tant que IPC, et je pourrais voir où surveiller et maintenir les comptes serait au mieux délicat.

Option 3: Ne vous inquiétez pas. Si l'utilisateur met trop de temps à voter, il suffit de lancer une erreur et de passer au suivant. Option 4: S'appuyer fortement sur AJAX, peut-être en utilisant Atmosphere, pour garder un compte en direct sur la page du concours. Vous ne savez pas comment gérer les délais d'expiration du navigateur ou quand l'utilisateur laisse simplement au milieu ... peut-être une sorte de minuterie de nettoyage? En ce moment, je me penche sur l'option 4, car elle semble trouver un bon équilibre entre la facilité de mise en œuvre et la facilité d'utilisation du point de vue de l'utilisateur, mais je veux être sûr que je ne manque aucun angle ici.

Comment les autres ont-ils géré des situations similaires?

Répondre

1

Vous pouvez envisager d'utiliser un verrouillage optimiste ou pessimiste. C'est la manière normale de résoudre les problèmes de concurrence.

Questions connexes