【发布时间】:2018-10-06 19:02:53
【问题描述】:
上下文:产品正在被多个线程更新。所以它领先于比赛条件。所以我使用乐观锁定,因为它经常不更新。产品的最新更新状态由updated_at属性决定。
例如,Prod (id=1) 在机器 t1 上更新:1。同一产品(id=1)在机器上的 t2 更新:2。现在机器上的 Prod (id=1) 状态:1 是陈旧的。
方法确定陈旧:我将机器上updated_at的值与数据库值中updated_at的存储值进行比较。
我主要关心的是设置@original_updated_at 的值。我应该使用attr_writer :original_updated_at。这是做乐观锁定的正确方法吗?
attr_accessor : :original_updated_at
def original_updated_at
@original_updated_at || updated_at.to_f
end
def stale_object?
if updated_at.to_f > original_updated_at.to_f
@original_updated_at = nil
return true
else
@original_updated_at = updated_at.to_f
return false
end
end
def recalculate
tries = 0
begin
raise Product::StaleObjectError.new("StaleObjectError") if stale_object?
attributes["updated_at"] = Time.now.utc
Product.where(:id => self.id).update_all(attributes)
self.attributes = attributes
rescue Product::StaleObjectError => e
if tries < MAX_RETRIES
tries += 1
sleep(1 + tries)
reload
retry
else
raise Product::StaleObjectError("StaleObjectError")
end
end
end
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 locking