3 Stimmen

Verhindern von doppelten Datenbankeinfügungen/-aktualisierungen in unserer Rails-App durch gleichzeitige Transaktionen

Da unsere Rails-Anwendung mit zunehmender Benutzeraktivität und Last zu tun hat, haben wir einige Probleme mit gleichzeitigen Transaktionen. Wir haben JavaScript verwendet, um die Schaltflächen nach Klicks zu deaktivieren / entfernen, und das funktioniert zum größten Teil, ist aber keine ideale Lösung. Kurz gesagt, die Benutzer führen eine Aktion mehrmals in schneller Folge aus. Da die Aktion zu einer Zeileneinfügung in die DB führt, können wir nicht nur eine Zeile in der Tabelle sperren. Angesichts des hohen Aktivitätsniveaus der betroffenen Modelle kann ich die üblichen Sperrmechanismen nicht verwenden ( http://guides.rubyonrails.org/active_record_querying.html#locking-records-for-update ), die Sie für eine Aktualisierung verwenden würden.

Diese Frage ( Verhindern gleichzeitiger Transaktionen in einer Webanwendung ) befasst sich mit einem ähnlichen Problem, aber es verwendet Dateisperren (Flock), um eine Lösung zu bieten, so dass dies nicht mit mehreren Anwendungsservern funktioniert, wie wir es haben. Ich nehme an, wir könnten etwas Ähnliches mit Redis oder einem anderen Datenspeicher machen, der allen unseren Anwendungsservern zur Verfügung steht, aber ich weiß nicht, ob dies das Problem wirklich vollständig löst.

Wie kann man doppelte Datenbankeinfügungen durch gleichzeitig ausgeführte Transaktionen am besten verhindern?

4voto

Peter Brown Punkte 49760

Versuchen Sie, einen eindeutigen Index zu der Tabelle hinzuzufügen, in der das Problem auftritt. Dadurch wird nicht verhindert, dass das System versucht, doppelte Daten einzufügen, aber es wird verhindern, dass sie in der Datenbank gespeichert werden. Sie müssen nur die Einfügung behandeln, wenn sie fehlschlägt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X