- PagerDuty /
- Der Blog /
- Zuverlässigkeit /
- Mehr Kontrolle über optimistisches Sperren in Rails
Der Blog
Mehr Kontrolle über optimistisches Sperren in Rails
Wie so ziemlich alles andere in Rails, optimistische Sperrung ist schön und einfach einzurichten: Sie fügen einfach eine Spalte „lock_version“ zu Ihrem ActiveRecord-Modell hinzu und schon sind Sie fertig. Wenn ein bestimmter Rails-Prozess versucht, einen Datensatz zu aktualisieren, und ein anderer Prozess es heimlich schafft, denselben Datensatz zu aktualisieren, während der erste Prozess nicht hingesehen hat (Sperre?!?), erhält der erste Prozess einen ActiveRecord::StaleObjectError, wenn er versucht, seine veralteten Daten in der Datenbank zu speichern.
Leider kann es jedoch, wie bei so ziemlich allen anderen praktischen Zaubertricks in Rails, schwierig sein, das Verhalten Ihren Bedürfnissen entsprechend zu optimieren. Nehmen wir beispielsweise an, dass Ihre Zeile ein Feld mit Statistikdaten (wie einem Zähler) oder anderen Daten enthält, bei denen es Ihnen (A) nichts ausmacht, wenn sie etwas veraltet sind, oder (B) die gelegentlich im Hintergrund aktualisiert werden sollen und das Speichern anderer (wichtigerer) Aktualisierungen nicht beeinträchtigen sollen. In diesen Fällen kann die integrierte optimistische Sperre etwas lästig werden.
Ja, Sie könnten diese Felder immer in eine eigene Tabelle/ein eigenes Modell mit einer has_one-Beziehung aufteilen, aber Sie möchten sich diesen Aufwand vielleicht nicht zu sehr anstrengen. Keine Angst! Mit dem folgenden Modul können Sie einfach die Zeilen hinzufügen:
SelectivelyOptimisticallyLockable einschließen skip_optimistic_locking :Feldname
zu Ihrem ActiveRecord-Modell, alle Aktualisierungen des betreffenden Felds erhöhen weder Ihren Lock_Version-Zähler, noch können StaleObjectErrors auftreten. (Getestet in Rails 2.3.X)