チーム メンバーが古い社内システムで問題に遭遇しました。ユーザーが Web ページのリンクをダブルクリックすると、ブラウザーから 2 つの要求が送信され、レースで同じレコードが 2 つのデータベースに挿入される可能性があります。調子; 最後に実行したものは主キー違反で失敗します。いくつかのソリューションとハックが提案され、議論されています。
Web ページで Javascript を使用して、最初のクリックでリンクを無効にすることにより、2 回目のクリックを軽減します。これは、問題の発生を減らすための迅速かつ簡単な方法ですが、完全になくすことはできません。
サーバー側でのリクエスト実行をトランザクションにラップします。これは、サーバーの負荷と問題のテーブルのロック レベルが原因で、操作のコストが高すぎると見なされています。
失敗した挿入によってスローされた主キー例外をキャッチし、それを識別して食べます。これには、(a) ベンダー ロックイン、データベース固有の例外のニュアンスを知る必要がある、(b) 正当なデータベース障害のログ記録/対処ができない可能性があるという欠点があります。
挿入が失敗した場合にレコードの更新を試行し、更新の結果をチェックして、影響を受ける 1 つのレコードが返されるようにする #3 の拡張。
考慮されていない他のオプションはありますか?見落とされていた提示されたオプションの長所と短所はありますか? すべての悪の中でどれが小さいですか?