このようにフィールドを更新すると、フィールドがロックされます。
UPDATE table SET field = field + 1
これは多少の負荷がかかると予想されるカウンターの一部であるため、複数のユーザーがサイトにアクセスしたときにすべてのカウントが登録されるとは限りません。
これを行うためのより良い方法または修正方法はありますか?
myisam エンジンは、トランザクションを実行する前に常にテーブルをロックしているため、他の同時トランザクションは、このトランザクションが完了するまで待機する必要があります。
あなたの解決策:
UPDATE table SET field = field + 1
絶対に完璧です。これは単一の SQL ステートメントであり、副作用なしで完全に実行されるか、まったく実行されません。さらにできることは、ステートメントが実際に実行されたかどうかを確認することだけです。そうでない場合は、実行を再試行できます。しかし、それには本当の理由はありません。そのままにしておくことができます...ほとんどの場合、正しく記述されたステートメントが失敗した場合、別の理由 (DB の過負荷など) があり、再試行すると事態がさらに悪化します。
そのテーブルへの短い書き込み/読み取りアクセスしかない場合は、すべて問題ありません。並行コマンドがそれにアクセスする必要がある場合、それらはロックが解放されるまで待機し、その後実行されます。
同じテーブルで、実行に1〜2秒以上かかる非常に時間のかかる操作がある場合のみ。その後、いくつかのカウントを失う可能性があります。ロックを取得するまでのタイムアウトは、通常 10 秒から 30 秒程度です。プロセスがテーブルを手動でロックし (例: "LOCK table")、それを解放しない場合にも、カウントが失われる可能性があります。これはバグです... 他の SQL ステートメントはロックを取得できず、長い待機期間の後、最終的に中止されます。