0

私はゲームのバックエンドに取り組んでいます。プレイヤーはまずデータベースに保存されているチケットを購入し、次にプレイして特定の賞品を獲得できます。各プレイヤーは最大 60 枚のチケットを購入できます。

ゲームごとの合計チケット数の上限を設定する新しい要件が登場しました - 10 000 チケット。実装には、購入エンドポイントに、その時点で購入したチケットの総数 + 現在の購入に必要なチケットの数が、そのゲームのチケットの最大数以下であることを確認するテストを追加する必要があります。受け付けます。

問題は、チケット テーブルの count を使用して現在の購入済みチケット数を計算すると、その間に他のプレイヤーがチケットを購入した可能性があるため、返される値が古い可能性があることです。

考えられる解決策は、購入中にチケット テーブルをロックすることですが、これはパフォーマンスとユーザー エクスペリエンスに悪影響を及ぼす可能性があります。違う考えがあれば教えてください。

4

1 に答える 1

2

厳しい制約がある場合は、複数の購入が同時に行われるのを避ける必要があります。おそらく、DB での適切なテーブル ロックが、このようなシリアライゼーションを実現するための最良の方法です。他の代替手段 (つまり、フロント エンドのどこかでシリアル化を実行する) も考えられますが、実装が面倒で、バグが発生しやすく、パフォーマンスが低下する可能性があります。

実際、DB を適切にロックしないと、ゲームの動作に一貫性を持たせることは難しい場合があります。一方、明示的なロックはおそらく必要ありません。適切なトランザクション分離レベルでデータベースを構成すると、必要なすべてのロックが行われます。

ここで得られる明確な勝利はないので、実際にパフォーマンスをテストできるようになるまで、パフォーマンスに関する質問は棚上げすることをお勧めします。十分ではないことが判明した場合は、実際の測定から、システムのどの部分がチューニングによって最も恩恵を受けるかを判断できます。

于 2014-11-10T20:19:13.210 に答える