2010-09-17 2 views
6

Situation: plusieurs serveurs frontaux (par exemple Silverlight, ASP) partageant un seul serveur principal (RIA WCF ou autre service Web).Empêcher l'édition en double/Verrouiller les enregistrements DB lors de l'édition - Serveur backend unique

Je suis à la recherche d'un standard pour empêcher plusieurs personnes d'éditer le même formulaire. Je comprends que ce n'est pas un sujet facile, mais les exigences sont des exigences.

Auparavant, j'ai utilisé la date de dernière modification de la base de données par rapport aux données soumises et j'ai donné un avertissement ou une erreur si les données avaient été modifiées depuis leur chargement. Le système initial a simplement remplacé les données sans avertissement. Le problème est que j'ai une nouvelle exigence pour éviter ces deux situations. Il y aura beaucoup d'interfaces utilisateur, donc un système de verrouillage peut être un défi, et il n'y a évidemment aucune garantie que le client ne fermera pas la fenêtre/le navigateur au milieu d'une édition.

J'apprécierais toute aide.

+0

Je ne suis pas tout à fait sûr que je suis. Êtes-vous à la recherche d'un système de verrou pessimiste qui empêche l'utilisateur d'éditer quelque chose qui, selon lui, est en cours de modification? OU cherchez-vous quelque chose d'optimiste qui permet plusieurs modifications, mais qui rejette les soumissions lorsque les données ont changé? – AnthonyWJones

+0

Le scénario de verrouillage pessimiste est trop limitatif, donc je suis en train de rayer l'idée.Je ne veux pas que les utilisateurs modifient pendant 30 minutes pour rejeter leurs modifications quand quelqu'un d'autre les a battus pour soumettre un changement. –

+0

Mais le scénario de fusion optimiste nécessite beaucoup de travail de ma part, car j'aurai besoin d'un outil qui permette au client de fusionner des propriétés publiques sur des objets, probablement à la manière d'une grille. –

Répondre

8

Si je me trompe, il semble que ce dont vous parlez est une forme de workflow de style check-out/edit/check-in. Vous voulez qu'un utilisateur édite un enregistrement, aucun autre utilisateur ne peut même commencer à éditer le même enregistrement.

Il s'agit d'une forme de concurrence pessimiste. optimiste concurrence simultanée - c'est-à-dire, ils vous diront que quelqu'un d'autre a déjà modifié l'enregistrement lorsque vous avez essayé d'enregistrer. Optimistic n'a aucune notion de verrouillage, vraiment - il s'assure qu'aucun autre utilisateur n'a enregistré entre le temps que vous avez récupéré et le temps que vous économisez. Ce que vous voulez n'est pas une exigence facile sur le web, puisque le serveur n'a vraiment aucun moyen d'imposer l'enregistrement quand un utilisateur annule une modification (par exemple, en fermant le navigateur). Je ne suis pas au courant des cadres qui gèrent cela en général.

Fondamentalement, ce dont vous avez besoin est de conserver les informations de paiement sur le serveur. Un processus utilisateur lors de l'édition devrait demander une extraction, et le serveur l'accorderait/le refuserait en fonction de ce qu'il vérifie. Le serveur doit également contenir les informations que la ressource est extraite. Lorsqu'un utilisateur enregistre le serveur, il libère le verrou et autorise une nouvelle extraction à la demande. Le problème survient lorsqu'un utilisateur annule l'édition - si c'est par l'intermédiaire de l'interface utilisateur, pas de problème ... dites simplement au serveur de libérer le verrou. Mais si c'est à travers la fermeture du navigateur, la mise hors tension de la machine, etc, alors vous avez un verrou orphelin. La plupart des gens résolvent l'une des deux façons suivantes: 1. Un délai d'expiration. La serrure sera finalement libérée. L'avantage ici est que c'est assez facile et fiable. Les inconvénients sont que l'enregistrement est verrouillé pendant un moment où il n'est pas vraiment en édition. Et, vous devez faire votre temps d'attente suffisamment long pour que si l'utilisateur prend vraiment très, très longtemps pour enregistrer, ils n'obtiennent pas une erreur parce que le verrou a expiré (et ils doivent recommencer). 2. Un battement de coeur. L'utilisateur envoie périodiquement une requête ping au serveur pour dire "oui, encore en train d'éditer". C'est essentiellement l'option de délai d'attente de # 1, mais avec un délai d'attente très court qui peut être actualisé à la demande. L'avantage est que vous pouvez le rendre arbitrairement court. L'inconvénient est une complexité accrue et l'utilisation du réseau.

Les jetons check-in/checkout ne sont vraiment pas si difficiles à mettre en œuvre si vous avez déjà un stock persistant transactionnel (comme une DB): la partie difficile l'intègre dans votre expérience utilisateur.

+0

Maux de tête! Pourquoi ai-je besoin de plus d'un utilisateur de toute façon? : -/ –

+0

Mais oui, c'est entre concurrence pessimiste et optimiste. Bien que je préfère l'approche optimiste, il pourrait potentiellement nécessiter beaucoup de travail (voir mon commentaire dans le message principal). Votre option de rythme cardiaque pessimiste semble la plus sûre, mais je dois décider si les compromis (laids) en valent la peine. –

+0

+1 chacun, bonne Q & A. Fondamentalement confirmé ce que je pensais ... ne pensait pas au rythme cardiaque cependant. –