Jruby on Rails同时保存在同一个表中

时间:2015-06-05 03:18:27

标签: ruby-on-rails ruby concurrency jruby simultaneous

如果两个或更多用户使用Jruby同时点击保存,如何在同一个表上保存数据? 这是我已经尝试过的代码

Sequence.transaction do
sq = Sequence.find_by_sequence_key('bus20158001', :lock => true)
sq.values = sq.values + 1
sq.save
end

由于某些原因,上述代码无效 Sequence是我的模型,它的字段是(id,sequence_key,values,created_at,updated_at)

1 个答案:

答案 0 :(得分:0)

"简单"答案是你需要确保检索,增量和保存是互斥的:

Sequence.exclusively do
  Sequence.transaction do
    sq = Sequence.find_by_sequence_key('bus20158001', :lock => true)
    sq.values = sq.values + 1
    sq.save
  end
end

你需要一个"全球"共享的互斥锁,例如:

class Sequence
  @@mutex = Mutex.new
  def exclusively; @@mutex.synchronize { yield } end
end

请注意,一般情况下,这可能是争用的来源(特别是如果find_by需要一些人应该总是查看数据库)......

...因此,另一个答案是将值设为" atomic"数据库级别的类似序列的计数器列(例如,您可以根据表中当前最高值的每次保存使用触发器更新它。)