【问题标题】:Pessimistic locking fails悲观锁定失败
【发布时间】:2015-11-04 11:57:35
【问题描述】:

我的控制器中有以下代码:

Item.transaction do
  item = JobDistribution.lock(true).find(params[:id])
  item.update_attributes(status: JobDistribution.statuses[:processing])
  respond_to do |format|
    format.json { render :json => "object processing", status: :success }
  end
end

但是当我运行代码时出现错误:

尝试更新过时的对象:项目

我不明白为什么,我遵循了 Rails 文档。

【问题讨论】:

  • 您从哪个文档中获得了这个?您正在尝试用旧数据覆盖新数据,而新数据被锁定。
  • 您有lock_version 专栏吗?当您尝试运行交易时,它是最新的号码吗?
  • @Robin 我确实有一个锁定版本列,这是失败的 sql 查询:UPDATE "items" SET "status" = 1, "updated_at" = '2015-11-04 11:54:36.422768', "lock_version" = 1 WHERE ("items"."id" = 35 AND "items"."lock_version" = 0)

标签: ruby-on-rails activerecord pessimistic-locking


【解决方案1】:

lock_version 用于乐观锁定,您还使用悲观锁定将find 从lock 链接起来。 Rails 在两者之间感到困惑 - 选择其中一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    相关资源
    最近更新 更多