1

私は小さなクリニックのためにキュー管理システムを書いています。複数のユーザーが同じことをしようとしているので、これらは並行性の問題です。私はACID保証に精通しており、トランザクションの概念も理解しています。2人が同時に同じデータを変更することはできないことを私は知っています。

しかし、ここに私の問題があります:私は特定の医者がその時間のために自由であるかどうかを決定するPHP機能を持っています。isFree($time)両方のユーザーが同じ関数を呼び出そうとすると、両方が肯定的な結果を取得して混乱する可能性があるので、どういうわけか、同時ユーザーをキューに入れるか、1つだけを受け入れる必要があります。

この問題を解決する最も簡単な方法は、関数を一度に1つずつ呼び出すことができるように制限することです。おそらく何らかのフラグまたはブロッキングシステムが必要ですが、それを行う方法について正確な考えはありません。

または、その一方で、重複する可能性のある関数呼び出しのみを制限する方がさらに高速です。たとえばisFree($time)、月曜日と火曜日の関数を同時に呼び出しても問題は発生しません。

4

1 に答える 1

1

あなたは事実上ロックを求めています。

あなたのキューシステムはデータベース用のMySQLで実行されていると思います。その場合はLOCK、使用しているテーブル(または、一部のデータベースエンジンでは、使用している特定の行)を使用できます。構造はLOCK TABLES yourTableName READです。

これにより、次の状態になるまで、他の人がテーブル内の何かを読み取るのを効果的に防ぐことができます。

  1. セッションが終了しました
  2. ロックを解放します(を使用してUNLOCK

これは、すべてのデータベースストレージエンジンに当てはまります。InnoDBは、トランザクションによる行レベルのロックをサポートしています。SELECTクエリを使用する代わりに、接尾辞を付けてFOR UPDATE、今読んだ行を完全にロックします。

これにより、MySQL/innoDBのロックメカニズムが明らかになることを願っています。ロックを解除するには、行を更新するか、トランザクションをコミットします。

于 2012-11-18T12:06:23.780 に答える