如果两个或更多用户使用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)
答案 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"数据库级别的类似序列的计数器列(例如,您可以根据表中当前最高值的每次保存使用触发器更新它。)