2011-01-04 6 views
1

Actully habe ich eine Asp.net Website entwickelt, die einen PDA App Teil hat. Der Fall ist, dass Mitarbeiter aus dem Unternehmen am Morgen kommen und Daten in ihren PDAs bekommen und sie arbeiten den ganzen Tag daran und am Abend kommen sie wieder ins Büro oder von jedem Web-Zugang aktualisieren sie die Daten auf dem Server. Wir haben dies über Web-Services getan, weil Web-Services Remote-Methoden sind, so dass sie nur durch Web-Zugriff darauf zugreifen konnten.Kontrolle Parallelität: Daten über Web-Services synchronisieren; Wie?

Jetzt ist das Problem Parallelität, dass während der Synchronisierung durch Web-Services wie Concurrency jedoch ihre Mitarbeiter viele sein könnten, die versuchen um Daten gleichzeitig zu aktualisieren.

In Webservices erhalten wir DataTable von PDA-Anwendung und aktualisieren oder einfügen Operationen über LINQ mit Sql Server.

Antwort

0

Was sind die Anwendungsfälle rund um die Daten, die die Clients mitnehmen? Aktualisieren sie nur Daten oder fügen sie auch neue Daten ein?

Um nur Daten zu aktualisieren, müssen Sie eine Entscheidung treffen, ob der letzte Wert für eine bestimmte Zeile der richtige ist (z. B. den Wert mit dem spätesten Zeitstempel festschreiben) oder ob in den anderen Daten ein Wert vorhanden ist.

Wenn ich mit dem Einfügen von Daten beschäftige, gehe ich davon aus, dass Ihre Datenbank einen inkrementellen Primärschlüssel verwendet. In diesem Fall können Sie die von der PDA-Anwendung empfangene DataTable nicht nur festschreiben. Sie müssen identifizieren, welche die neuen Zeilen sind, und dann diese neuen Zeilen OHNE die inkrementelle ID in die Servertabelle einfügen, um eine neue inkrementelle ID zu erzeugen. Sie müssen dann die DataTable des PDA mit den neuen IDs aktualisieren, die generiert wurden.

Um mit der tatsächlichen Reihenfolge umzugehen, in der die Updates verarbeitet werden (mehrere Clients synchronisieren zur gleichen Zeit) würde ich vorschlagen, dass der Synch-Prozess die Datensätze in eine Warteschlange stellt, damit die Serveraktualisierungen sequentiell verwaltet werden, was den Prozess zu einem macht etwas einfacher.

0

Sie könnten einen FIFO-ähnlichen Kanal erstellen, der aus "commit" -Anforderungen besteht. In diesem Fall können Sie Änderungen von jeweils nur einem Client durchführen (alle anderen Clients müssen warten). Gleichzeitig müssen Sie die Zeilen verfolgen, die aktualisiert wurden (neue Zeilen sind wahrscheinlich nicht der Fall). Wenn sich widersprüchliche Änderungen ergeben (Benutzer versucht, die Zeile zu ändern, die bereits von einem anderen Benutzer geändert wurde), dann wird die Clients sollten über sie Bescheid wissen (oder Sie könnten versuchen, diese Änderungen automatisch zusammenzuführen).

- Pavel

0

Werfen Sie einen Blick auf die Linq ChangeConflictException Klasse, die geworfen wird, wenn zwei Updates gegen die gleichen Daten auftreten. Sie können dies verwenden, um einen Konfliktlösungscode einzugeben. Wenn beispielsweise zwei Vertriebsmitarbeiter ein Produkt an denselben Client verkaufen, können Sie den Bezeichner ändern und dann erneut versuchen, einen Commit auszuführen. Oder die Änderungen können vollständig überschrieben werden. In diesem Fall können Sie einfach den neuen Wert abrufen und dann festschreiben.

Ein anderer Weg könnte darin bestehen, gespeicherte Prozeduren zu erstellen, die sich gegenseitig ausschließen und/oder Konsistenz garantieren, wenn sie ausgeführt werden. Auf diese Weise müssen Sie linq nicht verwenden, Sie können die Änderungen parsen und dann den entsprechenden SPROC für die DB ausführen, um eine Bestellung einzufügen oder ein Kundendetail zu aktualisieren.

Der Umgang mit Nebenläufigkeit in einer Anwendung muss zur Entwurfszeit getan werden, damit es gut funktioniert, viel Glück mit Ihrem Code.