シナリオ:Webベースのテキストゲーム
- プレーヤーAは、プレーヤーBに10,000クレジットを送信する要求を送信します(この要求は完了するのに20ミリ秒かかります)。
- 最初のリクエスト(まだ処理中)を送信してから3ミリ秒後、プレーヤーAは別のリクエストをバトルプレイヤーCに送信します。このリクエストは、完了するまでに100ミリ秒かかります。
何が起こっているのか、ステップ1で、アプリはプレーヤーAからクレジットを削除し、プレーヤーBにクレジットを渡しますが、これがデータベースに保持される前に、2番目のリクエストが来て、プレーヤーAのアカウントにまだ10kを示している状態をロードし、リクエストから正しい状態を上書きします1(0クレジット)ステップ2からの10k +バトルルート。結果:プレーヤーAとBの両方のアカウントに10kがあり、お金は2倍になりました。
これを防ぐために何ができるでしょうか?これは問題を示すための架空のシナリオであり、上記のシナリオではaccount=account+loot
sqlが実行しますが、すべてのデータ型で機能するソリューションを探しています。