3

我在我的 Rails API 中遇到了互斥问题。我的数据库中有一些 Event 对象,其中包含将参加该活动的人数。

考虑我的 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在同一个对象上排队该方法。

有没有办法做到这一点 ?

4

1 回答 1

2

标准的 ActiveRecord 事务将防止死锁或其他争用。您可能不得不使用悲观锁定策略。数据库旨在防止这种事情发生。

于 2012-10-24T21:30:01.023 回答