1

これについては、使用するのがどれだけ安全か疑問に思っている投稿がいくつかあることを知っています

UPDATE table SET field = field + 1 WHERE [...]

サーバーが 1 秒間遅れるとどうなりますか? 2 人のユーザーが同時にページをクリックすると、2 人ともフィールドを同じ数字として読み取り、同じフィールドを 1 ずつ増やしますか? それはmysqlなので、一度に1つずつ実行することである種のクエリシステムを持っていると思いますが、それが本当かどうかはわかりません。それが本当だと仮定するだけです。

4

3 に答える 3

4

この例では、読み取りと更新が同じステートメントで行われています。ステートメントはアトミックです (つまり、トランザクションのように振る舞うと見なすことができます) ので、すべて問題ありません。

于 2012-10-20T00:53:17.787 に答える
2

update ステートメントはアトミックです。更新クエリを実行すると、テーブル (または innodb の行) がロックされます。限目。2 人のユーザーが「同時に」をクリックすると、フィールドが 2 回正しく拡張されます。

于 2012-10-20T00:52:37.520 に答える
0

これが私が使用する別の方法です(別々のクエリがあり、テーブルを不必要にロックしたくない場合):

更新する代わりに、別のテーブルに挿入し(スキーマは関係ありません)、そのテーブルの項目を定期的に(あまり頻繁ではなく)カウントし、それに基づいて他のテーブルを更新します。テーブルが大きくなる場合は、カウントを増やしてからエントリを削除するだけです。さらに分析するためのタイムスタンプなど、他のメタデータを追加することもできます。

于 2012-10-20T01:01:18.697 に答える