web-dev-qa-db-ja.com

マルチユーザーシステムでの競合の処理または防止

世界中のさまざまな場所から複数のユーザーがアクセスするWebアプリケーションがあります。特定のドキュメントの「編集」フォームがあり、2人(またはそれ以上)のユーザーが同時にドキュメントを編集しているとします。どちらのユーザーもドキュメントを編集して送信できることを知っていますが、user1はuser2がドキュメントに変更を加えたことを確認できず、古いバージョンのドキュメントを送信する可能性があります。

ある種のロックを追加することを考えていましたが、user1が編集のためにドキュメントを開いただけで、何も変更しなかった(そして開いたままにした)場合、user2はそれを編集できません。したがって、エディターにタイムアウトを追加することを考えていましたが、user1はドキュメントへの変更が完了する前にタイムアウトになる可能性があります(たとえば、起動のために出かけたとします)。

問題は、他のユーザーがドキュメントを変更している間、1人のユーザーがドキュメントを編集できないようにする方法です。

注:この質問がここに属さない場合は、そのような質問をする理由と場所を説明してください。

3
Dementic

optimistic concurrency の実装の基本はそれほど難しくありません。

まず、データベースの行(または一連の行)を識別する方法が必要です(バージョン番号を考えてください)。

次に、ユーザーが確認または編集できるようにアプリケーションがデータをロードするときに、データのバージョンもロードします(上記を参照)。

3番目に、ユーザーが変更を保存するときは、変更するデータのバージョンがデータベースに存在するデータのバージョンと一致することを確認する必要があります。バージョン番号が一致しない場合は、何らかの古いデータ例外を発生させて処理します。

4
Tombatron