【问题标题】:Mutex in rails API among several client request几个客户端请求之间的rails API中的互斥锁
【发布时间】:2012-10-14 22:29:27
【问题描述】:

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

有没有办法做到这一点?

【问题讨论】:

  • 将事件排队,然后让一名工作人员处理它们。这行得通吗?

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


【解决方案1】:

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

【讨论】:

  • 谢谢,确实有帮助。但是我不想只锁定对数据库的访问,我想锁定一个对象的方法。我希望 Event.find(1).add_person 不能并行执行,但 Event.find(1) 是可能的(例如仅读取信息)。我还希望 Event.find(1).add_person 和 Event.find(2).add_person 成为可能。
  • 使用事务。他们将完全按照您的要求确保一致性和完整性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多