5

Ich lerne Schienen, und lesen Sie über optimistische Sperre. Ich habe lock_version Spalte des Typs integer in meine articles Tabelle hinzugefügt.Schienen - Optimistische Verriegelung löst immer StaleObjectError Ausnahme

Aber jetzt, wenn ich versuche, einen Datensatz zum ersten Mal zu aktualisieren, bekomme ich StaleObjectError Ausnahme.

Hier ist meine Migration:

class AddLockVersionToArticle < ActiveRecord::Migration 
    def change 
    add_column :articles, :lock_version, :integer 
    end 
end 

Wenn ich einen Artikel über Schienen Konsole versuchen Aktualisierung:

article = Article.first 
=> #<Article id: 1, title: "Ccccc", text: "dfdsfsdfsdf", created_at: "2015-02-20 21:58:45", updated_at: "2015-02-25 20:03:12", lock_version: 0> 

Und ich tue:

article.title = "new title" 
article.save 

bekomme ich diese:

(0.3ms) begin transaction 
    (0.3ms) UPDATE "articles" SET "title" = 'dwdwd', "updated_at" = '2015-02-25 20:40:36.537876', "lock_version" = 1 WHERE ("articles"."id" = 1 AND "articles"."lock_version" = 0) 
    (0.1ms) rollback transaction 
ActiveRecord::StaleObjectError: Attempted to update a stale object: Article 
+0

Vielleicht ist es die Standardeinstellung, aber die Sperrversion Spalte sollte einen Standardwert von 0 (in der Datenbank) haben –

+0

sind Sie sicher, dass Sie es zum ersten Mal tun? – CodeGroover

+0

@FrederickCheung lock_version ist bereits 0 – CodeGroover

Antwort

8

Sie haben alle Artikel lock_version auf 0 Blick auf die Abfrage zu initialisieren:

UPDATE "articles" SET "title" = 'dwdwd', "updated_at" = '2015-02-25 20:40:36.537876', "lock_version" = 1 WHERE ("articles"."id" = 1 AND "articles"."lock_version" = 0) 
     (0.1ms) 

Wenn die Abfrage 0 Datensätze aktualisiert, dann wird deren Rahmen an, dass Sie die Version aktualisiert oder gelöscht, um das Objekt in ein anderer Thread.

+3

Also sollten die Migrationen gewesen sein: 'add_column: articles,: lock_version,: integer, default: 0, null: false' – spickermann

+0

ja! Ich denke, das sollte funktionieren. – eritiro

+0

Ich stimme ab, lock_version ist bereits 0, und in dem Beispiel Autor mit bin/rails Konsole – CodeGroover