Frage

Ein Teammitglied hat mit einem alten Inhouse-System in ein Problem laufen, wo ein Benutzer einen Doppelklick auf einen Link auf einer Webseite kann dazu führen, zwei Anfragen aus dem Browser in zwei Datenbankeinlagen des gleichen Datensatzes resultierende gesendet werden in einer Wettlaufsituation; die letzten nicht mit einem Primärschlüssel Verletzung zu laufen. Mehrere Lösungen und Hacks vorgeschlagen und diskutiert:

  1. Verwenden Sie Javascript auf der Webseite der zweiten Klick durch Deaktivieren der Link auf den ersten Klick zu mildern. Dies ist eine schnelle und einfache Möglichkeit, das Auftreten des Problems zu reduzieren, aber nicht vollständig beseitigt sie.

  2. Wickeln Sie die Anfrage Ausführung auf der Sever Seite in einer Transaktion. Dies wurde zu teuer einer Operation als aufgrund der Serverauslastung und Verriegelungsstufen auf dem Tisch in Frage.

  3. Nehmen Sie den Primärschlüssel Ausnahme von dem ausgefallenen Einsatz geworfen, identifizieren sie als solche, und essen es. Dies hat die Nachteile (a) Vendor Lock-in, mit den Nuancen der Datenbank spezifischen Ausnahmen kennen, und (b) möglicherweise nicht Protokollierung / Umgang mit legitimen Datenbankfehlern.

  4. Eine Erweiterung # 3 durch den Versuch, den Datensatz zu aktualisieren, wenn der Einsatz schlägt fehl, und das Ergebnis der Aktualisierung überprüft, um sicherzustellen, gibt 1 Datensatz betroffen.

Die anderen Optionen sind, die nicht berücksichtigt worden sind? Gibt es Vor-und Nachteile der Optionen vorgestellt, die übersehen wurden? Welches ist das kleinere aller Übel?

War es hilfreich?

Lösung

Sie müssen das Synchronizer Token Muster implementieren.

Wie es funktioniert, ist: ein Wert (das Token) auf dem Server für jede Anforderung erzeugt wird. Das gleiche Token muss dann in Ihrem Formular Vorlage enthalten sein. Nach Eingang des Antrags sind die Server-Token und Client-Token verglichen, und wenn sie gleich sind, können Sie auch weiterhin Ihren Datensatz hinzufügen. Die serverseitige Token wird dann regeneriert, so nachfolgende Anfragen den alten Token enthält, wird fehlschlagen.

Es gibt eine gründlichere Erklärung etwa auf halbem Weg nach unten dieser Seite .

Ich bin mir nicht sicher, welche Technologie Sie verwenden, aber Struts bietet Framework-Level-Support für dieses Muster. Siehe Beispiel hier

Andere Tipps

Legen Sie eine eindeutige Kennung auf der Seite in einem versteckten Feld. Nur eine Antwort mit einer bestimmten eindeutigen Kennung akzeptieren.

Es klingt wie Sie eine GET-Anfrage könnten missbräuchlich Serverstatus zu ändern (obwohl dies nicht unbedingt der Fall ist). Auch wenn es nicht für Sie Situation angemessen sein kann, ist festzustellen, dass Sie den Link in eine Form POST Umwandlung in Betracht ziehen sollten.

Es scheint bereits Sie dort Ihre eigene Frage geantwortet; # 1 scheint die einzig gangbare Option zu sein.

Ansonsten sollten Sie wirklich tun alle drei Schritte - Datenintegrität auf Datenbankebene behandelt werden soll, aber zusätzliche Kontrollen (wie die explizite Transaktion) im Code Rundreise in die Datenbank zu vermeiden, könnten für die Leistung gut sein <. / p>

REF Sie müssen das Synchronizer Token Muster implementieren.

Dies ist für Javascript / HTML nicht JAVA

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