Frage

Ich habe einen WCF -Dienst, der zwei Methoden enthält:

HINWEIS: Der WCF -Dienst und der SQL -Server werden auf demselben Computer bereitgestellt. SQL Server verfügt über eine Tabelle namens Mitarbeiter, die Mitarbeiterinformationen verwaltet.

  1. Read () Diese Methode ruft alle Mitarbeiter von SQL Server ab.
  2. Write () Diese Methode schreibt (hinzufügen, aktualisieren, löschen) Info in der Mitarbeitertabelle in SQL Server.

Jetzt habe ich eine Desktop -basierte Anwendung entwickelt, über die jeder Client Mitarbeiterinformationen abfragen, hinzufügen, aktualisieren und löschen kann, indem er einen Webdienst verbraucht.

Frage:

Wie kann ich mit dem Szenario umgehen, wenn Mulitple -Kunden gleichzeitig die Mitarbeiterinformationen aktualisieren möchten? Ist der SQL -Server selbst mithilfe von Datenbanksperrungen verwaltet?

Bitte schlagen Sie mir den besten Ansatz vor !!

War es hilfreich?

Lösung

Im Allgemeinen in einer nicht verbundenen Umgebung optimistische Parallelität mit einer rowversion/timestamp ist der bevorzugte Ansatz. WCF tut Unterstützen Sie verteilte Transaktionen, aber das ist eine großartige Möglichkeit, ein langes Blockieren in das System einzuführen. Die meisten ORM -Tools unterstützen rowversion/timestamp Out-of-the-Box.

Natürlich am Server Möglicherweise möchten Sie Transaktionen verwenden (entweder verbindungsbasiert oder TransactionScope) Um einzelne Repository -Methoden "Säure" herzustellen, aber ich würde versuchen, Transaktionen auf dem Draht so weit wie möglich zu vermeiden.


Re -Kommentare; Tut mir leid, ich habe diese Kommentare ehrlich gesagt nicht gesehen. Manchmal macht Stackoverflow dies nicht einfach, wenn Sie viele Kommentare gleichzeitig erhalten. Hier gibt es zwei verschiedene Konzepte; Das Warten ist ein Symptom des Blockierens. Wenn jedoch 100 Kunden denselben Datensatz aktualisieren, ist dies bei jeder Transaktion vollständig geeignet, um zu blockieren. Um die Dinge einfach zu halten: Es sei denn, ich kann einen Engpass demonstrieren (für zusätzliche Arbeit), würde ich mit a beginnen Serialisierbar Transaktion um die Aktualisierungsvorgänge (TransactionScope verwendet dies standardmäßig). Auf diese Weise ja: Sie erhalten angemessenen Blockieren (Säure usw.) für die meisten Szenarien.

Jedoch; Das zweite Problem ist die Parallelität: Wenn Sie 100 Updates für denselben Datensatz erhalten, woher wissen Sie, was Sie vertrauen sollen? Die meisten Systeme lassen das Erste Aktualisieren Sie den Rest und verwerfen Sie den Rest, wenn sie mit abgestandenen Annahmen über die Daten arbeiten. Hier kommt der Zeitstempel/die Zeitstempel/Rowversion ins Spiel. Durch die Durchsetzung des Zeitstempels/der Zeitstempel/der MUSS muss "in der Update -Erklärung übereinstimmen, stellen Sie sicher, dass Personen nur Daten aktualisieren können, die sich seit ihrer Einnahme nicht geändert haben. Zu diesem Zweck ist es üblich, die Reihenversion neben jedem zu halten interessant Daten, die Sie aktualisieren.

Andere Tipps

Eine andere Alternative ist, dass Sie den WCF -Dienst als Singleton (InstanceContext.single) instanziieren können - was bedeutet, dass es nur eine Instanz davon jemals läuft. Anschließend können Sie ein einfaches Objekt im Speicher für das Update -Sperren aufbewahren und Ihre Aktualisierungsmethode basierend auf diesem Objekt sperren. Wenn Update -Anrufe aus anderen Sitzungen eingehen, müssen sie warten, bis das Schloss veröffentlicht wird.

Grüße, Steve

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top