5

テーブルからの選択に基づいて一連の計算を行い、その後新しい結果でテーブルを更新する Web サービスを PHP で作成しています。

ただし、別の人のセッションがまだ更新を行っている間に、別の人が同じ Web サービスを呼び出しているケースを防止したいと考えています。

そのテーブル全体をロックしてから再度ロック解除するのは正しいことですか? その場合、PHP pdo を使用して mysql テーブルをロックおよびロック解除するにはどうすればよいですか?

4

2 に答える 2

3

MySQL のようなデータベース管理システムは、このような同時実行違反を防ぐのに十分スマートです。

データベースの分離レベル (コミットされていない読み取り、コミットされた読み取り、反復可能な読み取り、シリアライズ可能) と考えられる問題 (ダーティー読み取り、反復不可能な読み取り ...) -> Wikipediaを探します。

個人的には、あなたのケースではテーブル ロックはお勧めしません。計算とデータベース操作をトランザクションでラップし、DBMS に依存して管理することをお勧めします。

于 2012-12-29T14:26:26.727 に答える
0

私はコメントを投稿しました:

直接の回答ではありませんが、問題ないと思います。計算とデータベースからのデータのフェッチは、数ミリ秒以内に行われます。2 人が同時にやり取りする可能性は非常に小さいため、ほとんどの人はわざわざこのようなロックを作成することはありません。

しかし、これらの計算が重要である場合は、新しいフィールドを追加して単にoccupiedbusyまたはそのようなものを呼び出すことで、この問題を防ぐことができます。

スクリプトを実行するとき、このフィールドがたとえば 1 に設定されているかどうかを確認します。設定されている場合は、スクリプトを 1 ~ 2 ~ 3 秒間スリープさせてから再試行します。このフィールドが 0 に設定されている場合は、1 に更新し、計算を行ってから、再び 0 に設定します。

これにより、2 人のユーザーが同時に同じ値にアクセスできなくなります。

于 2012-12-29T14:25:11.173 に答える