web-dev-qa-db-ja.com

同じデータを同時に編集できる複数のクライアントを管理するための戦略

複数のクライアントが同じオブジェクトを同時に編集する可能性がある状況にどのように対処できますか?

たとえば、プロファイルデータを編集できる管理コンソールを備えたWebアプリがあります。複数のユーザーが同じプロファイルを開いて編集したいと考えています。

そのままにしておくと、「最後に勝った人が勝つ」という状況になり、他のすべてのユーザーは変更を失います。

誰かが編集ページに入ると、クライアントでの編集用オブジェクトのブロックは、比較的簡単で、単純なオブジェクトでは全体的に受け入れられるようです。ただし、複雑なオブジェクトの場合、さまざまなユーザーがオブジェクトのさまざまな部分を変更したい場合は、マージする方がはるかに優れています。私は 競合のない複製されたデータ型に関する論文 を読みましたが、それはかなり複雑に思われ、競合状況をカバーしていません。

オブジェクトをマージする他の方法はありますか?それとも、状況に対処するためにまったく異なる戦略があるのでしょうか?

6
Yury Svechinsky

これを処理するために使用できる手法があります。最初にいくつかの前提があります。あなた(またはあなたのチーム)は、データを更新できるすべてのソフトウェアを制御する必要があります。これに基づいて、次のことができます。

  1. 元のダウンロード時およびユーザーがデータを編集している間は、データをロックしないでください。その理由は、一般的にロックはパフォーマンスにとって非常に悪いためです。たとえば、排他ロックが保持されているときにユーザーが休憩を取るとどうなるかなどです。

  2. ユーザーがデータを保存しようとしたときに、排他ロックを取得してデータを再度ダウンロードします。元のダウンロードデータとダウンロードしたばかりのデータを比較します。データに最後の更新のタイムスタンプが含まれている場合は、タイムスタンプを比較します。この目的で、最終更新のタイムスタンプ列を追加することを検討してください。データが同じである場合は、中間の更新が行われていないことを示しており、データベースを更新してロックを解放します。データが同じでない場合は、ロックを解除して更新されたデータを表示し、更新を再度入力するようユーザーに求めます。これを簡単にするために、彼の元の更新を別のタブまたはウィンドウに保存できます。もう1つの可能性は、ソフトウェアにマージを実行させ、競合をハイライト表示させることです。

3
Bob Bryan