Question

J'ai un service WCF qui a deux méthodes exposées:

Note:Le service wcf et sql server est déployé dans la même machine.Sql server a une table appelée employé qui maintient les renseignements sur les employés.

  1. Read() Cette méthode permet d'extraire tous les employés à partir de sql server.
  2. Write() Cette méthode écrit (ajouter,modifier,supprimer) des employés de l'info dans la table employee dans sql server.

Maintenant, j'ai développé un bureau en fonction de l'application à travers laquelle tout client peut requête, ajouter,mettre à jour et supprimer des renseignements sur les employés par la consommation d'un service web.

Question:

Comment puis-je gérer le scénario, si plusieurs clients veulent mettre à jour les renseignements sur les employés en même temps?Est le serveur sql se charge lui-même en utilisant la base de données de serrures ??

Merci de me suggérer la meilleure approche!!

Était-ce utile?

La solution

En général, dans un environnement déconnecté optimiste avec concurrency un rowversion / timestamp est l'approche privilégiée . WCF Finalité support des transactions distribuées, mais qui est un excellent moyen d'introduire le blocage long dans le système. La plupart des outils ORM soutiendront rowversion / timestamp hors-the-box.

Bien sûr, au serveur vous pouvez utiliser des transactions (soit en connexion ou TransactionScope) pour rendre les méthodes de dépôt individuel « acide », mais je voudrais essayer d'éviter les transactions sur le fil comme la mesure du possible.


Re commentaires; désolé, honnêtement, je ne vois pas ces commentaires; parfois stackoverflow ne rend pas facile si vous obtenez beaucoup de commentaires à la fois. Il y a ici deux concepts différents; l'attente est un symptôme de blocage, mais si vous avez 100 clients de mettre à jour le même enregistrement, il est tout à fait approprié pour bloquer lors de chaque transaction. Pour garder les choses simples: à moins que je peux démontrer un goulot d'étranglement (nécessitant un surcroît de travail), je commencerais avec sérialisable transaction autour des opérations de mise à jour (TransactionScope utilise par défaut). De cette façon, oui: vous obtenez le blocage approprié (ACID etc) pour la plupart des scénarios

.

Cependant; la deuxième question est la concurrence: si vous obtenez 100 mises à jour pour le même enregistrement, comment savez-vous qui faire confiance? La plupart des systèmes laisser le premier mise à jour dans et jeter le reste car ils fonctionnent sur des hypothèses périmées sur les données. C'est là l'horodatage / rowversion entrent en jeu. En appliquant « l'horodatage / rowversion doit correspondre à » sur l'instruction UPDATE, assurez-vous que les gens ne peuvent mettre à jour les données qui n'a pas changé depuis qu'ils ont pris leur photo. A cet effet, il est fréquent de garder le rowversion à côté de tout intéressant données que vous mettez à jour.

Autres conseils

Une autre alternative est que vous pouvez instancier le service WCF comme un singleton (InstanceContext.Unique) - ce qui signifie qu'il n'est qu'un exemple de la marche jamais.Ensuite, vous pouvez garder un simple objet en mémoire pour le but de la mise à jour de blocage et de verrouillage dans votre méthode de mise à jour à partir de cet objet.Lors de la mise à jour des appels viennent dans d'autres sessions, ils devront attendre jusqu'à ce que le verrou est libéré.

En ce qui concerne, Steve

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