Der Adaptive Server connection timed out
Fehler zurückzuführen ist, der die Aufzeichnung zu lange dauert aktualisieren. Eine Möglichkeit, das zu behandeln ist, die Anweisung Timeout in database.yml
zu erhöhen:
timeout: 10000 # milliseconds, default is 5000
Das ist nicht die Frage direkt nicht ansprechen, sondern könnte dazu beitragen, die Häufigkeit des Problems zu senken. Wie in Active Record Query Interface Guide beschrieben, funktioniert optimistisches Sperren nur, wenn das Feld lock_version
in der Tabelle vorhanden ist. Es ist nicht klar, ob Sie das Sperren an erster Stelle benötigen, aber Ihre Rails haben es eindeutig aktiviert und funktionieren.
Da der Wert von lock_version
das einzige ist, was die ActiveRecord::StaleObjectError
auslöst, könnten Sie das bei Ihrem zweiten Speicherversuch manipulieren. Der einfachste Weg wäre den neuesten Wert aus der Datenbank abfragen und Ihr Objekt entsprechend aktualisieren:
lock_version = Model.where(id: model.id).pluck(:lock_version).first
model.lock_version = lock_version
# then attempt to save again
model.save!
Beachten Sie, dass dies den Datenbank-Status mit den Änderungen neu zu schreiben, unabhängig von jedem parallel gemacht Modifikation, den Sieg über den Zweck der Verriegelung .
Having said that, es ist ein bisschen fischig, dass locking_version
ändert sich, wenn das Update ausläuft. Es lohnt sich, es zu erforschen, um zu sehen, warum genau das passiert. Sie sollten zumindest sicherstellen, dass das Update in eine Transaktion eingebettet wird, die das Problem möglicherweise alleine beheben kann.
'ActiveRecord :: StaleObjectError' wird gesendet, wenn optimistisches Sperren vorhanden ist. Sind Sie sicher, dass nicht versucht wird, den Datensatz parallel zu ändern? –
@NicNilov, ja, das ist sicher. – svz