Rails-ActiveRecord - wie kann ich die Sperre eine Tabelle zum Lesen?

Habe ich einige Rails ActiveRecord code, der wie folgt aussieht:

new_account_number = Model.maximum(:account_number)
# Some processing that usually involves incrementing
# the new account number by one.
Model.create(foo: 12, bar: 34, account_number: new_account_number)

Dieser code funktioniert gut auf seine eigene, aber ich habe einige hintergrund-jobs verarbeitet werden, indem DelayedJob Arbeitnehmer. Es gibt zwei Arbeiter, und wenn Sie beide starten der Verarbeitung einer batch-jobs, die sich mit diesem code, Sie am Ende die Schaffung neuer Model Datensätze, die den gleichen account_number, weil der Verzögerung zwischen der Feststellung der maximal-und das erstellen eines neuen Datensatzes mit einem noch höheren Konto-Nummer.

Jetzt habe ich es gelöst, indem Sie hinzufügen einer Eindeutigkeit auf der Datenbank-Ebene auf die Modelle-Tabelle und wiederholen Sie dann den Vorgang, indem Sie erneut auf die maximale im Fall dieser Einschränkung löst eine Ausnahme aus.

Aber es fühlt sich an wie ein hack.

Hinzufügen von auto-Inkrementieren auf der Datenbank-Ebene, um die account_number Spalte ist nicht eine option, weil die account_number zuweisen bringt mehr als nur Inkrementieren.

Idealerweise würde ich gerne um die Tabelle zu sperren, in Frage, die für das Lesen, so dass keine anderen ausführen kann, die maximale select-Abfrage gegen die Tabelle, bis ich fertig bin. Allerdings bin ich mir nicht sicher, wie das geht. Ich verwende Postgresql.

  • Einschränkungen sind nicht hacks, Handbuch Tabelle sperren ist ein hack.
  • Sperren Sie die Tabelle mit EXCLUSIVE läßt, liest passieren
InformationsquelleAutor Niels B. | 2014-07-05
Schreibe einen Kommentar