0

Ich plane, meine Rails-Anwendung zu mehreren Instanzen zu erweitern, aber sie werden immer noch die gleiche Datenbank verwenden. Wenn zwei Benutzer am Ende zwei verschiedene Instanzen der Anwendung verwenden, die dasselbe Konto bearbeiten, dann führt dies definitiv zu Wettlaufbedingungen - Was ist der beste Weg, dies zu verhindern, da es sich um eine Rails-Anwendung handelt?Race-Bedingung - mehrere Anwendungsinstanzen mit einer Datenbank

Die einzigen datenbankbezogenen Einstellungen, die ich kenne, ermöglichen die Angabe der tatsächlichen Server IP. Wenn ein Programm ein mittlerer Mann sein könnte, würde es das Problem lösen ... Sonst müssen die Anwendungsinstanzen irgendwie miteinander kommunizieren, oder?

Es sei denn, es eine Möglichkeit ist es, diese mit den Einstellungen in Postgres zu lösen ...

Jede Hilfe würde geschätzt !! Vielen Dank!

+0

hier ist ein Artikel, den Sie lesen können - https://www.leighhalliday.com/avoid-race-conditions-with-postgres-locks – Hardik127

Antwort

0

Ich schlage vor, eine optimistic locking Strategie zu implementieren. Rails unterstützt dies aus der Box. Ein vollwertiges Tutorial hierfür zu schreiben, gehört nicht zu einer Stackoverflow-Antwort. Detaillierte Anweisungen finden Sie online.

Die Grundlagen sind: Für jedes Modell, das Sie schützen möchten, müssen Sie eine ganze Spalte mit dem Namen des lock_version zum Modell Datenbanktabelle hinzuzufügen. Außerdem müssen Sie in jeder Form ein verstecktes Feld hinzufügen, das diese lock_version enthält. Und natürlich erlauben Sie den lock_version Parameter im Controller, wenn Sie sichere Parameter verwenden.

Immer wenn Sie einen Datensatz speichern und eine lock_version vorhanden ist, stellt Rails sicher, dass die lock_version mit der in der Datenbank übereinstimmt. Wenn sie nicht übereinstimmen, bedeutet dies, dass zwischenzeitlich ein anderes Update stattgefunden hat und das aktuelle Update mit einem StaleObjectError fehlschlägt.

Als Rückfallstrategie empfehle ich Ihnen, eine Flash-Nachricht für den Benutzer anzuzeigen, dessen Update abgelehnt wurde. Rendern Sie auch das Formular, das sie gerade ausgefüllt haben, indem Sie die aktuellen Werte aus der Datenbank verwenden (nicht die versuchten Eingaben, da Sie möchten, dass der Benutzer erneut überdenkt, ob die Änderungen angemessen waren).

(Sie können die Rücklenkungsstrategie Anwendung implementieren breit durch einen rescue_from Haken in Ihrem ApplicationController definieren.)

HTH!

+0

Also jedes Mal, wenn Sie gehen, um ein Update zu machen, erhalten Sie die aktuelle lock_version der Objekt mit Ihrer Anfrage für seinen aktuellen Zustand, cool. danke, ich schaue mir das mal an – Riptyde4

+0

Bin mir nicht ganz sicher was du mit 'aktuell' meinst aber richtig klingt. Schau es dir an und lass mich wissen, wie es für dich funktioniert! – Raffael

+0

Sorry, hätte nicht aktuell sagen sollen. Ich verstehe, dass es generiert und dann an die Person gesendet wird, die eine Aktualisierung anfordert. Wenn der Benutzer das Update sendet, sendet er die Sperrversion, und wenn sie nicht übereinstimmen, weiß das Backend, dass sich jemand anderes gerade in der Mitte eines Updates befindet. Habe ich das richtig verstanden? Ich werde dies in der Zukunft implementieren, aber ich habe nur darüber nachgedacht, was ich tun soll, wenn ich dort bin. Vielen Dank! – Riptyde4

Verwandte Themen