12

サイトのユーザーにポイントに基づいてランキングを与えるポイント システムに取り組んでいます。誰かがプロフィール ページをチェックするたびに、ユーザーに +1 ポイントを与えています。ユーザーが 200 ポイントを持っているとします。10 人のユーザーが自分のプロファイル ページをチェックしたのとまったく同じ時間に、コードは 200 が追加され、1 を取得し、10 人のユーザーが同時にいる場合、結果は 200 + 1 = 201 になります。 、データベースはどのように動作しますか?

ユーザーがプロファイルをチェックしたときの値は 200 だったので、論理的には 1 回の訪問のみをカウントします。

4

1 に答える 1

31

既存のポイント数を選択し、クライアントに 1 つ追加してから、更新された値をデータベースに書き戻すと、競合状態が発生します。ご指摘のとおり、一部のビューがカウントされない可能性があります。

代わりに、アトミック アップデートを使用して問題を回避してください。

UPDATE user SET points = points + 1 WHERE id = 42

別の方法は、で読み取ることSELECT ... FOR UPDATEです。ドキュメントから:

ページ ロックまたは行ロックを使用するストレージ エンジンで FOR UPDATE を使用する場合、クエリによって検査される行は、現在のトランザクションが終了するまで書き込みロックされます。LOCK IN SHARE MODE を使用すると、他のトランザクションが検査された行を読み取ることはできますが、それらを更新または削除することは許可しない共有ロックが設定されます。セクション 14.2.8.3「SELECT ... FOR UPDATE および SELECT ... LOCK IN SHARE MODE ロック読み取り」を参照してください。</p>

于 2012-11-06T11:33:28.510 に答える