2017-08-23 44 views
0

私のRailsアプリケーションでは、2人が同じケースに割り当てられないようにする必要があります。PGを使用したHerokuのRails/ActiveRecordは本当に遅いですか?

これは、ケースが既に割り当てられている場合は、「イベント」テーブルを調べることで行います。そうでなければ、それは割り当てられ、既に割り当てられているという行が作成されます。

これはすべて機能しますが、時にはそうでないこともあります。 2人が同じケースに同時にアクセスしようとすると(同じ数百ミリ秒で話している)、イベントテーブルが時間内に更新されないようです。

  1. ケースにUser1が割り当てられます。イベントテーブルに保存されます。
  2. User2は同じケースを割り当てるように求めます。このケースが既に割り当てられている場合は、[イベント - テーブル]をチェックします。 #1からの書き込みは、我々は、私がHerokuの上のPostgresとのRails 5.0.2を実行している#2

にチェックしている時点で登録されていないため、同じ場合は、ユーザ2に割り当てられている

  • (Standard-2X dynoとStandard-2 Postgres)。

  • +0

    この「イベント」テーブルとはなんですか?あなたのスキーマを表示できますか? 'Case'がデータベースの外部キーを持つ' assigned_user_id'カラムのようなものであれば、実際に何が起こって実際に問題が発生するのかは分かりません。最悪のケースでは、「フォームを保存する」2番目の人は、関係を上書きせずにケースを「盗む」かもしれませんが、それを問題と見なしても解決するより複雑なものです。 –

    答えて

    1

    残念ながら、このようなことが起こるのは珍しいことではありません。複数のスレッド/要求間のリソースの競合を避けたい場合は、ActiveRecord Lockingを使用して問題のCaseレコードをロックすることができます。

    私は個人的にはpessimistic lockingを好んでいます。なぜなら、それはアウトオブボックスであり、私の意見では、これらのDBロックが何であるかということです。

    +0

    これは行く方法です – Magnuss

    +1

    そして、データベースの一意性と強制性の制約を、多くの同様の問題に使用していることを確認してください。 'SELECT FOR UPDATE'は、彼の問題が「重複」行を挿入しているとうまくいかない。 –

    関連する問題