ボタンとして機能し、サーバー上でいくつかのアクションをトリガーするさまざまなフォームと要素を備えたWebアプリケーション(ゲーム)があります。問題は、ユーザーがボタンのクリックが速すぎたり、2つのタブでWebサイトを開いてから、いくつかのアクションを同時に発行したりすると、アプリケーションを混乱させることがあるということです。MySQLトランザクション、Javascriptを防ぐダブルクリックなど、いくつかの基本的な保護がありますが、とにかく何かがスキップされることがあります。もちろん、最善の方法は、システムを混乱させない方法で、すべてのSQLトランザクションとサポート機能を再設計することです。このような混乱の1つの例は、2つの更新を同時に発行することです。1つのWeb要求はデータベース内の何かを変更しますが、2番目の要求は古いデータで引き続き動作するため、SQL更新は「影響を受ける行の数はゼロでした」を返します。最初のトランザクションでデータベース内のデータがすでに変更されているためです。明らかな解決策は、UPDATEの直前にもう一度データを読み取って、それでも更新が必要かどうかを確認することですが、それは、より多くのdouble SELECTクエリをどこにでも配置することを意味し、良い解決策ではありません-なぜdbから同じデータを2回読み取るのですか?また、隠しトークンを使用して、更新要求ごとにサーバー上で比較し、同じトークンIDを持つ操作を拒否することも検討しましたが、これは、コードの非常に多くの場所に触れ、システムに新しいバグを導入することを意味します。この1つの問題。良い解決策ではありません-なぜdbから同じデータを2回読み取るのですか?また、隠しトークンを使用して、更新要求ごとにサーバー上で比較し、同じトークンIDを持つ操作を拒否することも検討しましたが、これは、コードの非常に多くの場所に触れ、システムに新しいバグを導入することを意味します。この1つの問題。良い解決策ではありません-なぜdbから同じデータを2回読み取るのですか?また、隠しトークンを使用して、更新要求ごとにサーバー上で比較し、同じトークンIDを持つ操作を拒否することも検討しましたが、これは、コードの非常に多くの場所に触れ、システムに新しいバグを導入することを意味します。この1つの問題。
アクションフローのロジックは次のようになります。ユーザーが2つのリクエストを同時に発行した場合、2番目のリクエストは最初のリクエストが完了するまで待機する必要があります。ただし、アプリケーションには多くのリダイレクトがあることも考慮する必要があります(たとえば、ユーザーがページを更新するときに二重のPOSTを回避するために、POSTの後で)。したがって、ソリューションはユーザーのデッドロックを作成しないようにする必要があります。
したがって、問題は、すべてのユーザー操作をシーケンシャルにすることができる最も簡単なグローバル修正は何でしょうか?良い普遍的な解決策はありますか?
MySQLとPHPを使用しています。