web-dev-qa-db-fra.com

Comment gérer les mises à jour conflictuelles d'un enregistrement client

Nous développons une application de type CRM simple page basée sur le Web. Je pensais à ce qui se passe lorsque deux opérateurs éditent tous deux les détails d'un client "John Doe". Côté serveur, nous utilisons une mise à jour optimiste, c'est-à-dire que la charge utile de la mise à jour ajax inclut le numéro de révision qui doit correspondre à ce qui se trouve dans la base de données, mais sur le front-end, je me demandais comment nous devrions gérer cela?

J'ai pensé à un popup modal dans le sens de: "Désolé AgentB a déjà mis à jour l'enregistrement et votre copie de travail n'est peut-être pas à jour? Souhaitez-vous:" (a) Quoi qu'il en soit (b) Recharger (c) Une forme de fusion

Cependant, je peux imaginer que les utilisateurs soient confus par cela. Ensuite, je commence à penser que ce scénario doit déjà avoir été couvert un million de fois. Existe-t-il des directives et des applications de référence fantastiques pour démontrer la meilleure façon de gérer ces problèmes communs dans une gamme d'applications multi-utilisateurs Web?

Nous sommes ouverts à utiliser tout cool-aid nécessaire pour obtenir la meilleure solution (websockets, frameworks ui etc ...).

19
MattUI

Vous essayez de faire face à l'édition simultanée, et malheureusement, il n'y a pas de solution facile pour cela. Les moyens courants de le gérer sont les suivants:

  1. Verrouillez l'enregistrement lorsque quelqu'un commence à le modifier. Cela empêchera un deuxième utilisateur de modifier un enregistrement en cours de modification et devrait l'informer que quelqu'un d'autre (éventuellement un nom) est en train de modifier cet enregistrement. C'est généralement le plus sûr, mais parfois vous avez des problèmes où quelque chose ne va pas alors qu'un enregistrement est verrouillé, et alors personne ne peut y accéder. Comme @Marjan l'a mentionné, c'est aussi un casse-tête quand rien ne va mal mais que quelqu'un commence à éditer puis s'épuise pour le déjeuner. Si vous utilisez cette méthode, vous devez utiliser 'verrouillage optimiste' ou ' contrôle de concurrence optimiste ' où vous vérifiez les modifications d'enregistrement récentes. Je n'entrerai pas dans la façon de traiter cela car c'est une question StackOverflow.

  2. Autorisez plusieurs personnes à modifier un enregistrement en même temps et mettez simplement à jour l'enregistrement lorsque chaque utilisateur enregistre ses modifications. C'est le plus simple à mettre en œuvre, mais cela peut avoir des conséquences très frustrantes lorsque les données qui ont été saisies sont manquantes même si quelqu'un est sûr de les avoir saisies. Je déconseille cette méthode .

  3. Autorisez les mises à jour en temps réel du contenu afin que chaque éditeur puisse voir les changements se produire en temps réel. C'est le plus préférable du point de vue de l'utilisateur, mais le plus difficile à mettre en œuvre sur le plan technique. Si vous le pouvez je recommanderais cette méthode . Comme légère modification de cette méthode, vous pouvez avoir une sorte de mini-verrou où chaque champ est verrouillé pendant qu'un utilisateur le modifie, mais pas la totalité de l'enregistrement. C'est ainsi que HotGloo, par exemple, traite les utilisateurs simultanés et cela fonctionne bien.

Résumé: Si vous n'avez pas beaucoup de temps et de ressources, utilisez l'option 1. Si les ressources et le temps ne sont pas un problème, optez pour l'option 3. Évitez l'option 2, sauf si vous êtes sûr qu'il n'y aura pas plusieurs utilisateurs modifiant un enregistrement en même temps.

13
JohnGB

Les systèmes de versioning sont amusants.

Bien que les systèmes et modèles de version existent, les problèmes liés à la modification du même fichier que quelqu'un d'autre reviennent généralement à la gestion (gestion physique ou gestion du personnel). Lorsque deux personnes ont le même dossier ouvert en même temps, sauf en cas de besoin, il est probable qu'elles prennent des décisions pour elles-mêmes.

Cela étant dit, il y a des cas où deux personnes peuvent vouloir faire la même révision. Ma femme et moi parlions du paiement des factures en ligne dans notre banque. Avec le système qu'ils ont mis en place, il est tout à fait possible pour moi de configurer un paiement automatique des factures et pour elle d'en configurer un sous sa connexion. Bien que nous utilisions le même compte, il n'y aurait aucun moyen de dire que le même paiement a été effectué deux fois sur le même compte bancaire en raison de la façon dont la banque traite la confidentialité des utilisateurs. C'est un énorme problème pour nous car nous ne pouvons pas déléguer le paiement des factures à l'un ou à l'autre, ou nous devons compromettre la sécurité de nos comptes en partageant la même connexion à plusieurs endroits (risque supplémentaire).

Plusieurs options sont disponibles du point de vue de la programmation

Vous voudrez peut-être examiner quelque chose comme etherpad pour avoir une idée de son fonctionnement. Google a intégré l'application à Google Wave. Fondamentalement, c'est une collaboration en temps réel, ce qui signifie que vous pouvez voir d'autres personnes taper et vous pouvez voir qui est en train de taper et leurs modifications. Voici un article sur lifehacker présentant les 10 meilleurs outils de collaboration Web.

Les équipes de développement logiciel utilisent des applications comme CVS (Concurrent Versioning System) pour "extraire" les fichiers à modifier, puis si quelqu'un d'autre se connecte au fichier, il n'a pas la possibilité. Smashing Magazine a un article montrant 7 systèmes de version de style CVS.

Le versioning existe même pour les rédacteurs

Des applications comme Microsoft Word, Adobe Indesign et Adobe InCopy utilisent le contrôle de version et créeront une version verrouillée d'un fichier et permettront aux autres utilisateurs de le voir en mode lecture seule. Word peut également suivre les modifications dans un fichier, puis autoriser différentes personnes à autoriser ou valider les modifications. InCopy et Indesign permettent à deux personnes de travailler sur le même fichier, le deuxième utilisateur importe le contenu édité dans leur document.

Lorsque je fais de la conception Web, j'utilise Adobe Dreamweaver. Bien qu'il s'intègre à CVS (si vous avez configuré votre serveur pour cela), ils vous permettent également de spécifier une application pour reconnaître les différences de fichiers et suivre les modifications. Dans ce cas, j'utilise WinMerge qui me montre ligne par ligne quelles lignes ont changé et les deux versions du document sont modifiables. Il est idéal pour afficher une comparaison ligne par ligne de fichiers.

L'un des autres systèmes de versionnage que je connais depuis quelques mois est utilisé ici sur Stack Exchange. J'examine tout du point de vue de l'expérience utilisateur et applique mes résultats aux projets. Fondamentalement, lorsqu'une modification est effectuée dans le système, un écouteur javascript remarque la modification et met à jour l'interface utilisateur pour vous informer qu'une nouvelle réponse a été publiée ou qu'une modification du contenu a été effectuée. Ensuite, il vous invite à mettre à jour le contenu. C'est l'une des meilleures méthodes que j'ai vues pour notifier les gens en termes de changements. Bien que l'exécution de modifications de code ou de copie ne soit pas toujours la meilleure, vous pouvez montrer à quelqu'un un aperçu des modifications dans une petite fenêtre avant de le charger.

Lorsque j'utilise MySQL Workbench (une interface graphique de connecteur de base de données) pour travailler directement sur les bases de données, j'ai remarqué qu'ils sont très intelligents pour effectuer leurs requêtes de mise à jour de base de données. D'après mon expérience, la plupart des développeurs Web remplaceront un jeu d'enregistrements entier, que des modifications aient été apportées ou non (car c'est plus facile). Dans Workbench, ils ont pris leur temps et ne remplacent que l'enregistrement qui a changé. Donc, si je mets à jour un numéro de téléphone sur une ligne et un titre sur une autre ligne, mes mises à jour SQL de base de données affichent uniquement le numéro de téléphone pour le premier ID et le titre pour le deuxième ID. Cela peut certainement réduire la quantité de copies écrasées car la plupart des informations sont stockées dans une base de données.

C'est un peu plus de travail, mais si vous avez le temps, créer un système qui fusionne un grand nombre de ces fonctions offrirait la meilleure expérience utilisateur et économiserait le plus de temps (et d'argent en raison du double travail et des enregistrements remplacés) à long terme.

2
AbsoluteƵERØ

Le meilleur moyen consiste à éviter ce conflit en mettant à jour le statut d'un client en temps réel, de sorte que dès qu'un utilisateur commence la mise à jour, les autres utilisateurs sont verrouillés (ou fournissent une vue en lecture seule). Toutefois, si vous souhaitez que les deux utilisateurs puissent accéder aux mêmes enregistrements et les mettre à jour, vous devez pouvoir créer des instances en double qui nécessitent une fusion soit automatique soit manuelle (recommandé). Du point de vue de l'utilisabilité, il est préférable qu'un utilisateur connaisse l'état de quelque chose plutôt que d'apporter des modifications et de voir quelque chose qui est différent de ce que son action précédente indiquerait. Cependant, cela dépendra de la manière dont les utilisateurs souhaitent utiliser le système et des besoins spécifiques de l'entreprise en termes d'informations client. Peut-être que le simple fait de rendre certains champs modifiables (par exemple, une section de notes textuelles) et d'autres en lecture seule fonctionnerait.

0
Michael Lai