Der Blog

Mehr Kontrolle über optimistisches Sperren in Rails

von Johannes Laban 10. Oktober 2011 | 2 Minuten Lesezeit

Wie so ziemlich alles andere in Rails, optimistische Sperrung ist einfach einzurichten: Sie fügen Ihrem ActiveRecord-Modell einfach die Spalte „lock_version“ hinzu, und schon sind Sie fertig. Wenn ein bestimmter Rails-Prozess versucht, einen Datensatz zu aktualisieren, und ein anderer Prozess es schafft, denselben Datensatz heimlich zu aktualisieren, während der erste Prozess nicht hingesehen hat (Sperrung?!?), erhält der erste Prozess einen ActiveRecord::StaleObjectError, wenn er versucht, seine veralteten Daten in der Datenbank zu speichern.

Leider ist es jedoch, wie bei fast allen anderen praktischen Funktionen in Rails, schwierig, das Verhalten an Ihre Bedürfnisse anzupassen. Nehmen wir beispielsweise an, Ihre Zeile enthält ein Feld mit Statistikdaten (z. B. einem Zähler) oder anderen Daten, bei denen (A) es Ihnen nichts ausmacht, wenn sie etwas veraltet sind, oder (B) die gelegentlich im Hintergrund aktualisiert werden sollen und nicht mit dem Speichern anderer (wichtigerer) Aktualisierungen kollidieren sollen. In diesen Fällen kann die integrierte optimistische Sperre etwas lästig werden.

Sie könnten diese Felder jederzeit in eine eigene Tabelle/ein eigenes Modell mit einer has_one-Beziehung ausgliedern, aber Sie möchten sich diesen Aufwand vielleicht nicht zu sehr anstrengen. Keine Angst! Mit dem folgenden Modul können Sie einfach die folgenden Zeilen hinzufügen:

 SelectivelyOptimisticallyLockable einschließen skip_optimistic_locking :Feldname 

In Ihrem ActiveRecord-Modell erhöhen Aktualisierungen des betreffenden Felds weder Ihren Lock_Version-Zähler noch können StaleObjectErrors auftreten. (Getestet in Rails 2.3.X)