テーブルからの選択に基づいて一連の計算を行い、その後新しい結果でテーブルを更新する Web サービスを PHP で作成しています。
ただし、別の人のセッションがまだ更新を行っている間に、別の人が同じ Web サービスを呼び出しているケースを防止したいと考えています。
そのテーブル全体をロックしてから再度ロック解除するのは正しいことですか? その場合、PHP pdo を使用して mysql テーブルをロックおよびロック解除するにはどうすればよいですか?
テーブルからの選択に基づいて一連の計算を行い、その後新しい結果でテーブルを更新する Web サービスを PHP で作成しています。
ただし、別の人のセッションがまだ更新を行っている間に、別の人が同じ Web サービスを呼び出しているケースを防止したいと考えています。
そのテーブル全体をロックしてから再度ロック解除するのは正しいことですか? その場合、PHP pdo を使用して mysql テーブルをロックおよびロック解除するにはどうすればよいですか?
MySQL のようなデータベース管理システムは、このような同時実行違反を防ぐのに十分スマートです。
個人的には、あなたのケースではテーブル ロックはお勧めしません。計算とデータベース操作をトランザクションでラップし、DBMS に依存して管理することをお勧めします。
私はコメントを投稿しました:
直接の回答ではありませんが、問題ないと思います。計算とデータベースからのデータのフェッチは、数ミリ秒以内に行われます。2 人が同時にやり取りする可能性は非常に小さいため、ほとんどの人はわざわざこのようなロックを作成することはありません。
しかし、これらの計算が重要である場合は、新しいフィールドを追加して単にoccupied
、busy
またはそのようなものを呼び出すことで、この問題を防ぐことができます。
スクリプトを実行するとき、このフィールドがたとえば 1 に設定されているかどうかを確認します。設定されている場合は、スクリプトを 1 ~ 2 ~ 3 秒間スリープさせてから再試行します。このフィールドが 0 に設定されている場合は、1 に更新し、計算を行ってから、再び 0 に設定します。
これにより、2 人のユーザーが同時に同じ値にアクセスできなくなります。