3

私が現在取り組んでいるアプリケーションでは、複数のユーザーが同時に何かを編集したい場合があります。つまり、楽観的ロックを実装する必要があります。ただし、このアプリケーションの場合、編集されるアイテムは、データベース内の複数の異なるテーブルからのレコードを含む科学プロトコルです。

そのため、プロトコル全体が1人のユーザーによる編集用にロックされていることを示したいので、私の質問につながります。これを行うための推奨される方法は、データベースレベルで編集をイベント化することです(たとえば、プロトコルの一意のIDを確認し、ロックされているかどうかを確認します)、またはメモリ内のWebサーバー自体で現在ロックされているプロトコルを追跡するために受け入れられますか?

現在、アプリケーションのユーザー数は約100人(同時に20人程度)と予想されていますが、将来的にはその数が増える可能性があるため、最もスケーラブルなオプションを使用することを検討しています。

4

3 に答える 3

5

この質問は、コードベースがどれだけうまく設計されているかにかかっていますか?

これらのレコードを変更するためのすべての呼び出しが単一のエントリポイントを通過する場合は、データベースをダムデータストアとして保持できるように、すべてのロックコードをアプリケーションに完全に保持することをお勧めします。

テーブルを変更できる複数のエントリポイントがある場合は、データベースレベルでロックを実装する必要があります。

于 2009-11-16T14:42:02.923 に答える
3

ロックを管理するテーブルをデータベースに実装します。例えば:

行:ProtocolID、EditingBeginDate、EditingEndDate

次に、アプリケーションの編集機能が試行されたときにクエリを実行できます。指定されたプロトコルに完了した時間枠がない場合は、指定されたユーザーによって編集されていることがわかります。レコードが永続的にロックされるのを防ぐために、編集セッションを閉じる必要がある特定の時間を実装できます。ただの提案:-D

于 2009-11-16T14:43:28.503 に答える
2

したがって、粗いロックが必要なようです。

最もスケーラブルなソリューションが必要な場合は、データベースまたは分散キャッシュのいずれかで情報をロックし続ける必要があります(この場合、分散キャッシュの方が高速です)。インメモリアプローチはスケーラブルではありません。より多くのサーバーが必要な場合は失敗します。デッドロックの可能性を防ぐために、ロックタイムアウトを導入することも忘れないでください。

于 2009-11-16T14:45:34.630 に答える