6
votes

Comment implémenter un verrouillage pessimiste dans une application Web PHP / MYSQL?

Comment implémenter un verrouillage pessimiste dans une application Web PHP / MySQL?

  1. Web-utilisateur ouvre une page pour éditer un ensemble de données (ligne)
  2. Web-utilisateur clique sur le bouton "LOCK", d'autres utilisateurs sont donc capables de lire mais de ne pas écrire ce jeu de données
  3. Web-utilisateur fait quelques modifications (prend peut-être 1 à 30 minutes)
  4. Web-utilisateur clique sur "Enregistrer" ou "Annuler" et "LOCK" est supprimé

    Y a-t-il des méthodes standard dans php / mysql pour ce scénario? Que se passe-t-il si le Web-utilisateur ne clique jamais sur "Enregistrer" / "Annuler" mais ferme l'Internet-Exploror?


0 commentaires

3 Réponses :


6
votes

Traditionnellement, cela se fait avec une colonne Boolean Verrouillé sur l'enregistrement de la base de données qui est marquée de manière appropriée.

Il s'agit d'une fonction de verrouillage de ce type que le verrou doit être libéré, et les circonstances peuvent empêcher que cela se produise naturellement (des collisions système, une stupidité de l'utilisateur, des paquets de réseau abandonnés, etc, etc). C'est pourquoi vous auriez besoin de fournir une méthode de déverrouillage manuelle et / ou d'imposer une limite de temps (peut-être avec un travail cron?) Sur la durée d'un enregistrement pour lequel un enregistrement peut être verrouillé. Vous pouvez mettre en œuvre une sorte de sondage Ajax pour garder l'enregistrement verrouillé si le navigateur est toujours ouvert? En tout cas, vous serez probablement préférable de vérifier que les données de l'enregistrement sont les mêmes que lorsque la serrure a été acquise avant de le modifier.

Cette limitation de ce type de comportement est particulièrement répandue dans les applications Web, mais est vraie de tout ce qui utilise cette approche - Sage Line 50, pour un, est un buggère pour cela, je dois régulièrement supprimer des fichiers de verrouillage après machine / Application Crashes.


0 commentaires

10
votes

Vous devez implémenter un champ de verrouillage et de verrouillage dans votre table. Ive fait cela dans de nombreuses applications en dehors de php / mysql et c'est toujours la même chose.

La serrure est terminée lorsque le TTL est passé, de sorte que vous puissiez effectuer une sous -trage des dates à l'aide de maintenant et de verrouiller pour voir si l'objet a été verrouillé pendant plus de 30 minutes ou 1h comme vous le souhaitez.

Un autre facteur est de considérer si l'utilisateur actuel est celui qui verrouille l'objet. C'est pourquoi vous avez également besoin d'un verrou. Cela peut être un utilisateur_id de votre base de données, une session_id de PHP. Mais gardez-le à quelque chose qui identifie un utilisateur, une iPaddress n'est pas un bon moyen de le faire.

finaly, pensez toujours à une fonction de déverrouillage de masse qui réinitialise simplement tous les serrures et bloquez ...

acclamations


5 commentaires

Notez également que l'optimiste est également un bon moyen de travailler, vous pouvez implémenter un verrouillage optimiste avec une seule colonne LastUpdate et la comparer à la dernière valeur de LastUpdate que vous avez dans un champ caché. Si les données ont changé, vous forcez l'utilisateur à accepter qu'il doit redémarrer son édition ou que vous pouvez essayer de voir si vous souhaitez effectuer une page de fusion pour afficher le nouveau et l'ancien contenu de l'utilisateur à comparer.


Je considérais quelque chose de très similaire au verrouillage et de verrouillage mentionné ci-dessus. Avez-vous déjà réfléchi à l'utilisation d'une requête JQuery / Ajax pour mettre à jour le champ Lockdate (à partir de la vue Modifier) ​​pendant que l'utilisateur travaille sur la modification?


Je ne voudrais pas mettre en œuvre une mise à jour de jackery Lock car, si, pour une raison quelconque, votre utilisateur finit par oublier son navigateur ouvert et que quelqu'un doit éditer l'objet, il ne sera jamais tiré. Donner une TTL raisonnable à votre lockdate est vraiment la méthode de choix.


Besoin de codage automatique pour implémenter un verrouillage pessimiste dans l'application Web, aucune seule fonction de fonction simple dans le cadre existant?


Je suis sûr que vous pouvez trouver un cadre qui aura cette fonctionnalité natif ou via un plugin, mais compte tenu de cela en 2013, vous voudrez peut-être examiner le besoin de verrouillage. Le comportement général de l'application est aujourd'hui d'utiliser des modèles de repos et ils ne sont pas vraiment bons pour le verrouillage pessimiste, peut-être optimistique à certains degrés, mais pas pessimiste.



7
votes

J'écrirais les serrures dans une table centralisée au lieu d'ajouter des champs à toutes les tables.

exemple de table de table:

Tblocks
  • Nom de Table (le nom de Tha Locked Table)
  • Rowid (clé primaire de la rangée de table verrouillée)
  • LockDateTime (lorsque la ligne a été verrouillée)
  • LOCKUER (Qui a verrouillé la ligne)

    Avec cette approche, vous pouvez trouver tous les verrous fabriqués par un utilisateur sans avoir à numériser toutes les tables. Vous pouvez tuer tous les serrures lorsque l'utilisateur se déconnecte par exemple.


0 commentaires