私が現在取り組んでいるプロジェクトには、いわゆる課題があります。課題にはメンバーと参加者がいます。メンバーとは、チャレンジにアクセスできるすべての人 (単一のユーザーまたはユーザーのグループの両方) であり、参加者はユーザーごとに参加に関する統計を追跡します。
チャレンジ参加者は、新しいチャレンジ メンバーが追加されるたびに再計算されます。これはイベントベースで発生するため、チャレンジ メンバーがcreated
イベントをトリガーし、チャレンジ参加者がリッスンします。
問題は、2 つのチャレンジ メンバーが同時に作成された場合に発生します。つまり、イベントも 2 回トリガーされ、コードの 2 つの実行が同時に実行されます。説明する:
challenge.getMembers();
challenge.getParticipants();
// calculations
foreach member not in participants, create participant
前述のように、上記のコードが同時に実行されている場合、より具体的にはgetParticipants
、最初の実行が欠落していた参加者エントリを作成する前に 2 番目の実行が到達した場合に問題が発生します。どちらの実行でも、一部の参加者が欠落していることを確認し、それらを作成します。これは、一部のユーザーのチャレンジ参加者のエントリが重複していることを意味します。
現在、この問題に対する私たちの解決策はchallenge_id, user_id
、チャレンジ参加者に一意のインデックスを設定することです。ただし、制約に違反しているときにエラーを無視するのは少し汚いと感じます。また、すべてのエラーがコールバックに渡されるだけなので、他の SQL エラーをチェックするのが難しくなります。エラー文字列の内容をチェックして、それが適切なエラー (一意性違反) であるかどうかを確認する必要があります。好ましくないエラー (不適切な構文など) を処理する必要があります。
このコードは複数のサーバーで実行されるため、mutices を使用しても、コードが同時に実行されないという保証はありません。また、同じチャレンジで同時に実行されない限り、異なるチャレンジで同時に実行されてもかまいません。このタイプの同時マージを処理するための提案はありますか?