0

私はRailsアプリケーションを複数のインスタンスにスケールアップする予定ですが、引き続き同じデータベースを使用します。 2人のユーザーがアプリケーションの2つの異なるインスタンスを使用して同じアカウントを編集した場合、これは間違いなく競合条件をどこかに引き起こします。これがRailsアプリケーションである場合、これを防ぐにはどうすればよいでしょうか?レースの条件 - 1つのデータベースを使用する複数のアプリケーションインスタンス

私が知っている唯一のデータベース関連設定では、実際のサーバーIPの指定が可能です。プログラムが中間の人間になれば、どうにかして問題を解決できます。そうでなければ、アプリケーションインスタンスは何らかの形で互いに通信する必要がありますか?

Postgresの中に、この設定を使用して解決する方法がない限り...

任意の助けいただければ幸いです!ありがとう!

+0

ここには記事があります。https://www.leighhalliday.com/avoid-race-conditions-with-postgreslocks – Hardik127

答えて

0

optimistic locking戦略を実装することをお勧めします。 Railsはこれをそのままの状態でサポートします。このための本格的なチュートリアルを書くことは、stackoverflowの答えの範囲外です。詳細な手順はオンラインで確認してください。

基本は以下のとおりです。あなたが保護したい各モデルの 、あなたは、モデルのデータベーステーブルにlock_versionと呼ばれる整数列を追加する必要があります。さらに、すべてのフォームで、このlock_versionを運ぶ隠しフィールドを追加する必要があります。もちろん安全なパラメータを使用している場合は、コントローラのlock_versionパラメータを許可します。

レコードを保存し、lock_versionが存在するときはいつでも、Railsはlock_versionがデータベースのものと一致することを確認します。一致しない場合は、その間に別の更新が行われたことを意味し、現在の更新はStaleObjectErrorで失敗します。

代替戦略として、更新が拒否されたユーザーにフラッシュメッセージを表示することをお勧めします。また、データベースからの現在の値を使用して、入力を再入力するのと同じフォームをレンダリングします(ユーザーの変更が適切かどうか再考する必要があるため)。

(あなたのApplicationControllerrescue_fromフックを定義することで、広いフォールバック戦略のアプリケーションを実装することができます。)

HTH!

+0

更新をするたびに、あなたは現在のlock_versionを取得します。現在の状態、クールのあなたの要求とオブジェクト。ありがとう、私はこれを見ていきます – Riptyde4

+0

あなたは「現在」が何を意味しているのか完全にはっきりしていませんが、正しいことについては聞きます。それをチェックし、それがあなたのためにどのように機能するか教えてください! – Raffael

+0

申し訳ありませんが、電流を言ってはいけません。私はそれが生成されたことを理解し、更新を求める人に送信します。ユーザーが更新を送信すると、ロックバージョンが送信されます。一致しない場合、バックエンドは他のユーザーが更新中であることも知っています。私はそれを得ましたか? 今後これを実装する予定ですが、私がそこに着くときに何をすべきか考えていただけです。ありがとう! – Riptyde4

関連する問題