1

シナリオ:Webベースのテキストゲーム

  1. プレーヤーAは、プレーヤーBに10,000クレジットを送信する要求を送信します(この要求は完了するのに20ミリ秒かかります)。
  2. 最初のリクエスト(まだ処理中)を送信してから3ミリ秒後、プレーヤーAは別のリクエストをバトルプレイヤーCに送信します。このリクエストは、完了するまでに100ミリ秒かかります。

何が起こっているのか、ステップ1で、アプリはプレーヤーAからクレジットを削除し、プレーヤーBにクレジットを渡しますが、これがデータベースに保持される前に、2番目のリクエストが来て、プレーヤーAのアカウントにまだ10kを示している状態をロードし、リクエストから正しい状態を上書きします1(0クレジット)ステップ2からの10k +バトルルート。結果:プレーヤーAとBの両方のアカウントに10kがあり、お金は2倍になりました。

これを防ぐために何ができるでしょうか?これは問題を示すための架空のシナリオであり、上記のシナリオではaccount=account+lootsqlが実行しますが、すべてのデータ型で機能するソリューションを探しています。

4

1 に答える 1

2

データベースでをシリアル化可能に設定するtransaction isolation levelと、データベースレベルで上記を単一のアトミックオカレンスとして扱うことができます。

原子性は、データベースシステムの重要なコンポーネントの1つです。

于 2012-10-10T19:46:08.130 に答える