我在 Rails API 中遇到互斥问题。 我的数据库中有一些 Event 对象,其中包含将参加该事件的人数。
考虑我的事件方法,该方法将一个人添加到事件中:
class Event
def add_person
nb = self.number_of_person + 1
# Some stuff
self.number_of_person = nb
self.save
end
end
现在,假设客户 A 和 B 想参加事件 E。 Rails 将收到 2 个请求,并将并行调用 add_person 方法。 最后,事件E中的人数有可能不是加2,而是加1。
这就是我想要做的:
Client A | Client B | Possible in parallel
--------------------------------------------------------------------------
Event.find(1).show | Event.find(1).show | yes
Event.find(1).add_person | Event.find(1).add_person | no
Event.find(1).add_person | Event.find(2).add_person | yes
我只想对同一对象的 add_person
方法进行排队。
有办法吗?
最佳答案
标准的 ActiveRecord 事务将防止死锁或其他争用。您可能必须使用 pessimistic locking strategy .数据库就是为了防止这种事情而设计的。
关于ruby-on-rails-3 - 多个客户端请求之间的 Rails API 中的互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13056737/