かなり複雑な Web アプリケーションで複数の MySQL InnoDB テーブルにまたがるデータを管理するためにトランザクションを使用しています。簡単に言えば、特定のトランザクションは次のように機能します。
- 「user_point_totals」テーブルの行からデータが読み取られます
- さまざまな策略が、ユーザーの新しいポイントの合計がどうあるべきかを計算します
- 更新された合計を反映して、「user_point_totals」テーブルに新しいエントリが作成されます
ユーザー A が、ポイントに関連する分岐を含む何らかのアクションを実行し、ステップ 1 が実行され、その実行スレッドがユーザーのポイント合計をメモリに読み取り、アプリケーションが新しい合計の計算を開始するとします。一方、ユーザー B は、ユーザー A のポイント合計に影響を与えるアクションを実行し、別のトランザクションが開始されます。ただし、最初のトランザクションはまだ完了していないため、2 番目のスレッドは最初のトランザクションと同じポイント合計値を (同じテーブル行から) 開始点として取得します。続いて、トランザクション 1 が完了し、新しい値がどうあるべきかを認識して新しいユーザー ポイントの合計を作成します。その後すぐに、トランザクション 2 が完了し、ユーザーのポイントの合計の新しい行も作成します。ただし、2 番目のトランザクションのポイント合計が正しくなくなり、
私の質問は次のとおりです。
- トランザクションのアトミックな性質のために、このシナリオは不可能ですか?
- そうでない場合、この種の状況でデータの整合性が存在することをどのように保証しますか?
ご検討いただきありがとうございます。