状況
こんにちは、私はデータベース駆動型のゲームを作成しています。このゲームでは質問があり、正しい答えを見つけた場合、ユーザーは質問を変更する (つまり、新しい質問を作成する) 権利を取得します。
しかし、これには重要な問題があります。競合状態と呼ばれるものだと思います。問題はこれです:
- ユーザー 1 が答えを見つける
- ユーザー 1 は、新しい質問を入力するように求められます
- ユーザー 1 が新しい質問を送信する前に、ユーザー 2 も新しい回答を見つける
- 新しい質問を提出するのは運だけです。ユーザー 2 がユーザー 1 の後に質問を送信すると、ユーザー 2 の質問がユーザー 1 の質問を上書きします。
現在、ある種のセマフォを使用してこの問題を修正しましたtimestamp
。要約すると、次のように機能します。
- ユーザー 1 が答えを見つける
- セマフォは次のようにデータベースに保存されます
['user_ip' = 'x.x' , 'time'='y.y' , 'locked'='true']
- セマフォは t 秒後に期限切れになります
- セマフォの有効期限が切れている場合にのみ、新しい質問が受け入れられます。
そのため、新しい質問が送信されると、セマフォがロックされておらずt
、現在の時刻がセマフォの日付より (15) 秒大きい場合にのみ、アプリケーションはそれを受け入れます。
しかし、これにも問題があり、ユーザー 2 にプロンプトが表示されます
「あなたは答えを見つけましたが、あなたの前に誰かが見つけました。15 秒以内に新しい質問が提出されない場合は、質問を変更できます。」
したがって、新しい勝者は 15 秒待たなければなりませんが、おそらく不必要です。
したがって、
私がしたいこと
「勝者」にストップウォッチ(タイムカウンター)でフォームを促したい。ゼロになると、セマフォのロックが解除され、新しい勝者が質問を送信できるようになります。
しかし、このソリューションには次の問題があります。
勝者がタイム カウンターがゼロになる前にページを閉じた場合、AJAX 要求は実行されず、セマフォは無期限にロックされます。
userLeave();
そのため、ユーザーがページを閉じた場合に関数を呼び出したことを確認する必要があります。
Googleは提案onbeforeunload
していますonunload
が、人々はそれらの機能が機能していないことに不満を持っています。ユーザー (勝者) がページを離れた場合に、この AJAX 呼び出しを送信する 100% 確実な方法はありますか?