Rails - 乐观锁定总是触发StaleObjectError异常

Raf*_*del 5 ruby ruby-on-rails optimistic-locking rails-activerecord

我正在学习rails,并阅读乐观的锁定.我添加lock_version类型的列integer到我的articles表.

但是现在每当我第一次尝试更新记录,我都会遇到StaleObjectError异常.

这是我的迁移:

class AddLockVersionToArticle < ActiveRecord::Migration
  def change
    add_column :articles, :lock_version, :integer
  end
end
Run Code Online (Sandbox Code Playgroud)

当我尝试通过rails控制台更新文章时:

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>
Run Code Online (Sandbox Code Playgroud)

我这样做:

article.title = "new title"
article.save
Run Code Online (Sandbox Code Playgroud)

我明白了:

(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
Run Code Online (Sandbox Code Playgroud)

eri*_*iro 8

你必须将所有文章lock_version初始化为0.查看查询:

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) 
Run Code Online (Sandbox Code Playgroud)

如果查询返回更新的0条记录,则框架假设您已更新版本或删除了另一个线程中的对象.

  • 所以迁移应该是:`add_column:articles,:lock_version,:integer,default:0,null:false` (3认同)
  • @CodeGroover显然rails控制台显示`lock_verison`有0值.但是当我检查数据库时,它的值为"null".将列更改为具有默认值可解决问题. (3认同)