3

RailsAPIでの相互排除の問題に直面しています。データベースに、イベントに参加する人の数を含む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 に答える