Mutex在rails API中有几个客户端请求

时间:2012-10-24 19:57:12

标签: ruby-on-rails-3 mutual-exclusion

我在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方法。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

标准的ActiveRecord事务可以防止死锁或其他争用。您可能必须使用pessimistic locking strategy。数据库旨在防止这种事情发生。