web-dev-qa-db-ja.com

顧客レコードの競合する更新を処理する方法

シンプルなWebベースの単一ページCRMのようなアプリを開発しています。 2人のオペレーターが両方とも顧客「John Doe」の詳細を編集しているときにどうなるかを考えていました。サーバー側では楽観的な更新を使用します。つまり、ajax更新ペイロードにはデータベースの内容と一致する必要があるリビジョン番号が含まれますが、フロントエンドではこれをどのように処理する必要があるのか​​疑問に思いましたか?

「申し訳ありませんが、エージェントBはすでにレコードを更新しているため、作業コピーが最新ではない可能性がありますか?」(a)とにかく更新(b)再読み込み(c)何らかの形のマージ

しかし、ユーザーが混乱していることは想像できます。次に、このシナリオはすでに100万回カバーされているに違いないと考え始めます。 Webベースのマルチユーザー基幹業務アプリケーションでこのような一般的な懸念を処理するための最良の方法を示すためのガイドラインと素晴らしいリファレンスアプリはありますか?

最善の解決策(ウェブソケット、UIフレームワークなど)を達成するために必要なクールエイドを自由に使用できます。

19
MattUI

あなたは同時編集に対処しようとしていますが、残念ながらこれを解決する簡単な方法はありません。それを処理する一般的な方法は次のとおりです。

  1. 誰かが編集を開始するときにレコードをロックします。これにより、2番目のユーザーが編集中のレコードを編集できなくなり、他の誰かに通知する必要があります(おそらく名前)がそのレコードを編集しています。これは一般的に最も安全ですが、レコードがロックされているときに問題が発生し、誰もアクセスできないという問題が発生する場合があります。 @Marjanが述べたように、何も問題がなく、誰かが編集を開始してから、昼食に足りなくなった場合も頭痛の種です。この方法を使用する場合は、「楽観的ロック」または「 楽観的同時実行制御 」を使用して、最近のレコードの変更を確認する必要があります。 StackOverflowの質問なので、その対処方法については説明しません。

  2. 複数のユーザーが同時にレコードを編集できるようにし、各ユーザーが編集を保存するときにレコードを更新するだけです。これは実装するのが最も簡単ですが、入力されたデータが入力されたと確信しているにもかかわらず、入力されたデータが欠落しているという非常に苛立たしい結果をもたらす可能性があります。私はこの方法に対して助言します

  3. 各編集者がリアルタイムで行われる変更を確認できるように、コンテンツのリアルタイム更新を許可します。これはユーザーの観点からは最も望ましい方法ですが、実装するのが技術的に最も困難です。できればこの方法をお勧めします。このメソッドのわずかな変更として、レコード全体ではなく、ユーザーがフィールドを編集している間、各フィールドをロックする、一種のミニロックを設定できます。これは、たとえばHotGlooが同時ユーザーを処理する方法であり、うまく機能します。

概要:時間とリソースが少ない場合は、オプション1を使用します。リソースと時間に問題がない場合は、オプション3に進みます。複数のユーザーが同時にレコードを編集しないことが確実でない限り、オプション2は避けてください。

13
JohnGB

バージョン管理システムは楽しいです。

バージョン管理システムとモデルは存在しますが、他のユーザーと同じファイルを編集する際の問題は、通常、管理(物理管理または人事管理)に戻ります。 2人のユーザーが同じファイルを同時に開いている場合、必要がない限り、自分で決定を下している可能性があります。

とはいえ、2人が同じ改訂を行いたい場合があるかもしれません。私の妻と私は、銀行でのオンライン請求書支払いについて話していました。彼らが備えているシステムがあれば、私が自動請求書支払いをセットアップし、彼女が彼女のログインの下でそれをセットアップすることは完全に可能です。同じ口座を使用していますが、銀行がユーザーのプライバシーをどのように扱っているかにより、同じ銀行口座から同じ支払いが2回行われたことを確認する方法はありません。これは私たちにとって大きな問題です。請求の支払いを一方または他方に委任できないか、同じログインを複数の場所で共有することによってアカウントのセキュリティを侵害する必要があるためです(リスクの追加)。

プログラミングの観点から利用可能ないくつかのオプションがあります

etherpad のようなものを調べて、それがどのように機能するかについてのアイデアを得ることができます。 GoogleはこのアプリをGoogle Waveに組み込みました。基本的にはリアルタイムの共同作業です。つまり、他の人が入力しているのを見たり、入力しているのが誰なのかを確認したり、編集したりできます。 lifehackerのトップ10のWebコラボレーションツールを紹介する投稿です。

ソフトウェア開発チームは、CVS(Concurrent Versioning System)などのアプリケーションを使用してファイルを「チェックアウト」して編集し、他の誰かがファイルに接続しようとすると、オプションがありません。 Smashing Magazineには、7つのCVSスタイルのバージョン管理システムを示す記事があります。

コピーライターにもバージョン管理が存在します

Microsoft Word、Adobe Indesign、Adobe InCopyなどのアプリケーションはバージョン管理を使用し、ファイルのロックバージョンを作成し、他のユーザーが読み取り専用モードでそれを表示できるようにします。 Wordは、ファイルの変更を追跡し、別のユーザーが変更を承認またはコミットできるようにすることもできます。 InCopyとIndesignを使用すると、2人のユーザーが同じファイルで作業できます。2人目のユーザーは、編集したコンテンツをドキュメントにインポートします。

Webデザインをしているときは、Adobe Dreamweaverを使用します。 CVSと統合しますが(サーバーを構成した場合)、ファイルの違いを認識して変更を追跡するためのアプリケーションを指定することもできます。その場合、 WinMerge を使用します。これにより、変更された行が1行ずつ表示され、ドキュメントの両方のバージョンが編集可能です。ファイルの行ごとの比較を表示するのに最適です。

ここ数か月で私がよく知っている他のバージョン管理システムの1つが、ここStack Exchangeで使用されています。ユーザーエクスペリエンスの観点からすべてを調査し、調査結果をプロジェクトに適用します。基本的に、システムで編集が行われると、JavaScriptリスナーが変更に気づき、ユーザーインターフェイスを更新して、新しい回答が投稿されたか、コンテンツが編集されたことを通知します。次に、コンテンツを更新するように求められます。これは、変更に関して人々に通知するために私が見てきたより良い方法の1つです。コードまたはコピーでの変更の実行は常に最良であるとは限りませんが、変更をロードする前に小さなウィンドウで変更のプレビューを誰かに表示することができます。

MySQL Workbench(データベースコネクタGUI)を使用してデータベースを直接操作しているとき、データベース更新クエリの実行は非常に賢いことに気付きました。私の経験では、ほとんどのWeb開発者は、変更が行われたかどうかに関係なく、レコードセット全体を置き換えます(簡単なため)。 Workbenchでは時間をかけて、変更されたレコードのみを置き換えます。したがって、ある行の電話番号と別の行のタイトルを更新すると、データベースSQLの更新では、最初のIDの電話番号と2番目のIDのタイトルのみが表示されます。ほとんどの情報はデータベースに保存されているため、上書きコピーの量を確実に削減できます。

少し手間がかかりますが、時間がある場合は、これらの機能の多くを統合するシステムを作成すると、最高のユーザーエクスペリエンスを提供し、長期的にはほとんどの時間(および二重の作業と上書きされたレコードによるコスト)を節約できます。

2
AbsoluteƵERØ

最良の方法は、顧客のステータスをリアルタイムで更新してこの競合を実際に回避し、1人のユーザーが更新を開始するとすぐに他のユーザーがロックアウトされる(または読み取り専用ビューが提供される)ことです。ただし、両方のユーザーが同じレコードにアクセスして更新できるようにする必要がある場合は、自動または手動でマージを実行する必要がある重複インスタンスを作成できる必要があります(推奨)。ユーザビリティの観点からは、ユーザーは変更を加えるのではなく、何かの状態を知っていて、以前のアクションが示すものとは異なる何かを見ることが望ましいです。ただし、それは、ユーザーがシステムをどのように使用するか、および顧客情報に関する特定のビジネス要件に依存します。おそらく、一部のフィールドを編集可能にするだけで(たとえば、テキストのみのメモセクション)、他のフィールドは読み取り専用にすることができます。

0
Michael Lai