2010-08-20 4 views
1

Je travaille actuellement sur une application web où j'ai rencontré un petit problème. Dans ce système, plusieurs utilisateurs peuvent se connecter à la même page et mettre à jour les données (une série de cases à cocher, de listes déroulantes et de champs de texte). Le problème est que les données peuvent être écrasées si un utilisateur était déjà sur une page où les anciennes données ont été chargées, et a depuis été mis à jour, et soumet leurs changements, qui mettent à jour tout.Conflit de mise à jour des données

Des suggestions sur la façon de résoudre ce problème? Je travaille actuellement avec des fichiers en texte brut.

+1

Lecture recommandée: [Concurrency] (http://www.brainbell.com/tutors/php/php_mysql/Transactions_and_Concurrency.html) (c'est pour les bases de données, mais toujours applicable ici). Celui-ci est appelé le problème de "mise à jour perdue". – NullUserException

Répondre

2

Je ne travaille actuellement qu'avec des fichiers en texte brut.

Suggestion 1. Utilisez une base de données.

Suggestion 2. Utilisez un fichier de verrouillage. Utilisez les appels d'API au niveau du système d'exploitation pour ouvrir un fichier avec un verrou exclusif . Le premier utilisateur à acquérir ce fichier a un accès exclusif aux données. Lorsque cet utilisateur termine sa transaction, fermez le fichier, libérez le verrou au niveau du système d'exploitation.

Suggestion 3. Ne pas "mettre à jour" le fichier. Enregistrez l'historique des modifications. Vous pouvez ensuite lire les noms d'utilisateur et les horodatages du journal pour trouver la dernière version.

Si vous faites cela, vous devez faire à chaque demande quelque chose comme ceci.

  1. Lors de l'obtention de l'état actuel, lisez la dernière ligne du fichier. En outre, obtenez la taille du fichier et la dernière modification. Conservez la taille et la dernière heure de la session. Afficher l'état actuel dans le formulaire.

  2. Lorsque la modification de l'utilisateur est en cours de traitement, vérifiez la taille du fichier et l'heure de la dernière modification. Si le fichier est différent de ce qui a été enregistré dans la session, cet utilisateur tente de mettre à jour les données qui ont été modifiées par quelqu'un d'autre. Lire la dernière ligne du fichier. En outre, obtenez la taille du fichier et la dernière modification. Conservez la taille et la dernière heure de la session. Afficher l'état actuel dans le formulaire.

En outre, vous souhaiterez peut-être avoir deux fichiers. L'un avec des données "actuelles", l'autre avec l'historique des changements. Cela peut rendre plus rapide la recherche des données actuelles, puisque c'est le seul enregistrement dans le fichier d'état actuel. Un autre choix consiste à avoir un "en-tête" dans votre fichier qui est un bloc de texte de taille fixe. Chaque fois que vous ajoutez, vous aussi seek(0,0) et actualisez l'en-tête avec le décalage au dernier enregistrement ainsi que l'horodatage de la dernière modification.

0

Vous pouvez créer une table supplémentaire et y stocker toutes les informations ainsi que l'ID utilisateur. Ainsi, vous pourrez accéder à l'aide de jointures à toutes les données insérées par les utilisateurs.

+0

Il n'a pas de tables. – NullUserException

+0

Un désolé, puis passez cette réponse – Centurion

1

Lors de l'enregistrement de nouvelles données, vous pouvez comparer la date à laquelle les données ont été modifiées avec le moment où l'utilisateur a commencé à les modifier.

S'il y a eu des modifications pendant que l'utilisateur effectuait des modifications, vous pourriez alors lui montrer un message et lui demander quelle version prendre ou lui permettre de fusionner les deux versions.

Ce problème a été résolu par des systèmes de révision, comme svn, git, etc. de la même manière.

Questions connexes