web-dev-qa-db-fra.com

Comment gérez-vous plusieurs utilisateurs qui modifient la même donnée dans une application Web?

Il y a un projet sur lequel je travaille qui cherche à produire une application Web qui gérera une liste de tâches entre plusieurs utilisateurs. Il s'agit d'une liste de tâches principale dont les éléments de tâche sont distribués par un utilisateur autorisé. Chaque utilisateur a son propre compte pour se connecter et voir les tâches qui lui sont assignées; il est possible pour plusieurs utilisateurs d'avoir une seule tâche en commun.

J'essaie de laisser les détails du projet en dehors de cela car je m'attaque davantage au concept global de la façon de gérer les situations suivantes, mais si cela aide, j'utilise Java, EclipseLink et GWT avec la mise en œuvre de RequestFactory. La base de données est PostgreSQL.

Les problèmes conceptuels que j'essaie de concilier sont donc les suivants:

  1. Si une seule tâche commune à plusieurs utilisateurs change d'une manière quelconque, par exemple tâche terminée, supprimée, etc., la liste des tâches de tous les utilisateurs qui ont cette tâche sera mise à jour. Quels sont les modèles de conception qui aident à mettre en œuvre cette fonction?

    • Certains modèles que j'ai examinés sont Observateur et Médiateur - y en a-t-il d'autres qui devraient être pris en compte à ce sujet?
  2. Supposons que deux utilisateurs modifient la même tâche en même temps.

    • Premièrement, dois-je permettre que cette situation se produise ou dois-je mettre un verrou dessus jusqu'à ce que l'une ou l'autre personne ait fait des changements?

    • Deuxièmement, si je ne mets pas de verrou dessus, comment puis-je concilier les modifications à accepter? Cela implique la situation en 1, car l'utilisateur 1 pourrait soumettre les données et avant que l'utilisateur 2 ne reçoive les données mises à jour, il/elle peut avoir avancé et soumis ses modifications.

Je suis vraiment à la recherche de points de repère, de conseils ou de conseils que vous pouvez fournir sur la façon de synchroniser correctement les données entre plusieurs instances de cette application Web. Je l'apprécierais beaucoup!

28
hulkmeister

Je pense que Tableau blanc sera votre modèle de choix pour # 1, vous devriez publier les modifications des tâches (ou d'autres données partagées) dans un endroit commun, afin que toutes les parties intéressées puissent les voir et DTRT.

Pour # 2, vous devez regarder verrouillage optimiste . Fondamentalement, vous devez horodater tous vos enregistrements modifiables avec l'heure de la dernière mise à jour. Lorsque vous essayez de sauvegarder l'enregistrement, vous vérifiez d'abord que l'enregistrement dans la base de données a le même horodatage mis à jour en dernier que votre enregistrement. Sinon, quelqu'un a mis à jour l'enregistrement et vous devez maintenant obtenir l'enregistrement mis à jour et informer l'utilisateur qu'il doit saisir à nouveau ses modifications, ou vous pouvez essayer de fusionner les modifications de l'utilisateur dans l'enregistrement mis à jour (ce qui s'avère généralement être simple ou impossible).

19
TMN

J'ai trouvé une conception pour une application de bureau (qui n'a pas encore été entièrement testée) avec des exigences similaires qui pourraient être utiles.

Ma solution a été d'utiliser le modèle MVC (avec un seul modèle mais plusieurs contrôleurs et vues) où chaque contrôleur a apporté des modifications au modèle à l'aide de transactions (en utilisant - STM ) et lorsqu'une transaction était validée, le modèle diffusait une notification de mise à jour aux vues.

Chaque client a également gardé une trace de tout ce qui était mis à jour localement, mais lorsque ces mises à jour locales ont été terminées (c'est-à-dire envoyées pour être validées), il est revenu à utiliser les informations du modèle sous-jacent.

J'ai également eu une pile d'annulation avec toutes les modifications apportées par les utilisateurs afin que les choses puissent être inversées.

Ce n'est peut-être pas le meilleur modèle pour une application Web, car le modèle a dû diffuser des modifications dans les vues, ce qui n'est peut-être pas le plus simple avec un client Web.

7
paul

pour 1. vous devriez voir si le modèle publication/abonnement est mieux adapté.
pour 2. cela dépend de votre situation:

  • quelle sera la fréquence de cette situation?
  • quelle est la situation dans laquelle l'un de vos utilisateurs ne pourra pas mettre à jour une tâche parce qu'elle est verrouillée ou que quelqu'un d'autre l'a modifiée entre-temps?
    personnellement, je préfère une approche (utilisée par exemple dans pivotaltracker ) dans laquelle il y a:
    • pas de serrures,
    • vous voyez tous les changements en temps réel, et
    • l'interface utilisateur invite à effectuer des mises à jour mineures fréquentes au lieu de plus grandes sur plusieurs attributs.
    • vous conservez un historique de toutes les modifications apportées. si l'historique est visible pour les utilisateurs, les conflits ou les remplacements qui peuvent survenir peuvent être résolus par des commentaires, des annotations ou des messages.
4
kr1

Ma recommandation est de ne jamais verrouiller et signaler un conflit s'il se produit.

Veuillez jeter un œil à:

https://github.com/spring-projects/spring-petclinic/issues/4

Vous pouvez voir une vidéo et un exemple de code.

Cela répondra-t-il à vos exigences?

0
Eduardo