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?