Comment puis-je implémenter le verrouillage pessimiste & # 8221; dans une application asp.net?

StackOverflow https://stackoverflow.com/questions/617934

  •  03-07-2019
  •  | 
  •  

Question

Je souhaiterais obtenir les conseils de toute personne expérimentée dans la mise en œuvre de quelque chose comme "le verrouillage pessimiste". dans une application asp.net. C'est le comportement que je recherche:

  1. L'utilisateur A ouvre la commande n ° 313
  2. L'utilisateur B tente d'ouvrir la commande n ° 313, mais il est informé que l'ordre a été ouvert exclusivement pour l'utilisateur A depuis X minutes.

Comme je n'ai pas implémenté cette fonctionnalité auparavant, j'ai quelques questions de conception:

  • Quelles données dois-je joindre au dossier de commande? Je considère:
    • LockOwnedBy
    • LockAcquiredTime
    • LockRefreshedTime

Je considérerais un enregistrement comme déverrouillé si LockRefreshedTime < (Maintenant - 10 min).

  • Comment puis-je garantir que les verrous ne sont pas conservés plus longtemps que nécessaire mais n'expirent pas de manière inattendue?

Je suis assez à l'aise avec jQuery, donc les approches utilisant le script client sont les bienvenues. Il s’agirait d’une application Web interne, ce qui me permettrait d’être plutôt libéral dans mon utilisation de la bande passante / des cycles. Je me demande aussi si le "verrouillage pessimiste" est un terme approprié pour ce concept.

Était-ce utile?

La solution

On dirait que vous êtes presque tout le chemin. Je ne pense pas que vous ayez vraiment besoin de LockRefreshedTime, cela n'ajoute rien. Vous pouvez aussi bien utiliser LockAcquiredTime pour décider quand un verrou est devenu obsolète.

Vous voudrez également vous assurer que vous utilisez bien les transactions. Vous devez terminer la vérification et la définition du verrou dans une transaction de base de données afin d'éviter de vous retrouver avec deux utilisateurs qui pensent avoir un verrou valide.

Si vous avez des tâches qui nécessitent l’obtention de verrous sur plusieurs ressources (c’est-à-dire plus d’un enregistrement d’un type donné ou plus d’un type d’enregistrement), vous devez appliquer les verrous dans le même ordre partout où vous effectuez le verrouillage. . Sinon, vous pouvez avoir un verrou mortel, où un bit de code a un enregistrement A verrouillé et veut verrouiller un enregistrement B et un autre bit de code a B verrouillé et est en attente pour un enregistrement A.

Pour vous assurer que les verrous ne sont pas libérés de manière inattendue. Assurez-vous que si vous avez un processus de longue durée pouvant durer plus longtemps que votre délai de verrouillage, il actualise son verrou lors de son exécution.

Le terme "verrouillage explicite" est également utilisé pour décrire ce moment de verrouillage.

Autres conseils

Je l'ai fait manuellement.

  • Stockez la clé primaire de l’enregistrement dans une table de verrouillage et marquez l’enregistrement attribut de mode à modifier.
  • Lorsqu'un autre utilisateur essaie de sélectionner cet enregistrement, indiquez le nom de l'utilisateur. prêt seulement enregistrer.
  • Fixez un délai maximum pour verrouiller les enregistrements.
  • Actualisez les données de la page pour les enregistrements verrouillés. Alors qu'un utilisateur est autorisé à apporter des modifications, tous les autres utilisateurs sont uniquement autorisés à vérifier.

La table de verrouillage doit avoir un design similaire à celui-ci:

User_ID, //who locked
Lock_start_Time,
Locked_Row_ID(Entity_ID), //this is primary key of the table of locked row.
Table_Name(Entity_Name) //table name of the locked row.

La logique restante est quelque chose que vous devez comprendre.

C’est une idée que j’ai mise en œuvre il ya 4 ans à la demande d’un client. Après ce client, personne ne m'a encore demandé de faire quelque chose de similaire, je n'ai donc utilisé aucune autre méthode.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top