2011-01-04 2 views
1

Actaully j'ai développé un site Web Asp.net qui a une partie de l'application PDA. Le cas est que les employés de l'entreprise viennent le matin et obtiennent des données dans leur PDA et ils travaillent sur eux toute la journée et en soirée ils viennent à nouveau au bureau ou à partir de n'importe quel accès web ils mettent à jour les données sur le serveur. Nous avons fait cela par le biais des services Web, car les services Web sont des méthodes distantes qui leur permettent d'accéder uniquement à l'accès Web.contrôle simultanéité: synchronisation des données via les services Web; Comment?

Maintenant, le problème est que la simultanéité de la synchronisation des services Web permet de contrôler la concurrence. mettre à jour les données à la fois.

Dans les services Web, nous recevons DataTable de l'application PDA et mettons à jour ou insérons des opérations via LINQ avec Sql Server.

Répondre

0

Quels sont les cas d'utilisation autour des données que les clients emportent avec eux? Sont-ils seulement en train de mettre à jour les données ou insèrent-ils aussi de nouvelles données? Pour uniquement mettre à jour les données, vous devez décider si la dernière valeur d'une ligne particulière est correcte (par exemple, valider la valeur avec l'horodatage le plus récent) ou s'il y a une valeur dans les autres données.

En traitant de l'insertion de données, je vais faire l'hypothèse que votre base de données utilise une clé primaire incrémentale. Dans ce cas, vous ne pourrez pas simplement valider le DataTable reçu de l'application PDA. Vous devrez identifier quelles sont les nouvelles lignes, puis insérer ces nouvelles lignes SANS l'ID incrémental dans la table du serveur afin de générer un nouvel identifiant incrémental. Vous devez ensuite mettre à jour le DataTable du PDA avec les nouveaux ID générés. Pour traiter l'ordre réel dans lequel les mises à jour sont traitées (plusieurs clients se synchronisent en même temps), le processus de synchronisation place les jeux de données dans une file d'attente afin que les mises à jour du serveur soient séquentiellement gérées. un peu plus simple.

0

Ce que vous pourriez faire, c'est que vous pourriez créer un canal de type FIFO consistant en des requêtes "commit". Dans ce cas, vous pouvez effectuer des modifications provenant d'un seul client à la fois (tous les autres clients devront attendre). En même temps, vous devez garder une trace des lignes qui ont été mises à jour (les nouvelles lignes ne sont probablement pas le cas) S'il y a des changements conflictuels (l'utilisateur essaie de modifier la ligne qui a déjà été modifiée par un autre utilisateur) les clients doivent être au courant (ou vous pouvez essayer de fusionner automatiquement ces changements).

- Pavel

0

Jetez un oeil à la classe Linq ChangeConflictException qui sera levée lorsque deux mises à jour se produisent contre les mêmes données. Vous pouvez l'utiliser pour mettre du code de résolution de conflit. Par exemple, si deux vendeurs vendent un produit au même client, vous pouvez changer l'identifiant et essayer de recommencer. Ou les modifications peuvent être complètement OK pour remplacer, dans ce cas, vous pouvez simplement récupérer la nouvelle valeur, puis valider.

Un autre chemin pourrait être de créer des procédures stockées qui s'excluent mutuellement et/ou garantissent la cohérence lors de leur exécution. De cette façon, vous n'avez pas besoin d'utiliser linq, vous pouvez faire un peu d'analyse des changements et ensuite exécuter le SPROC approprié contre la base de données pour insérer une commande, ou mettre à jour un détail client.

Le traitement de la simultanéité dans une application doit être fait au moment du design pour que cela fonctionne bien, bonne chance avec votre code.

Questions connexes