GUIレイヤーでのユーザー入力の同時実行性をどのように処理/反応しますか?
-
08-07-2019 - |
質問
ユーザー入力の同時実行性を処理する良い方法は何ですか?
この質問に対する回答として、すでにデータベースのロックを除外しています、一般的な同時ユーザー入力をどのように処理しますか?
行ロックによって実装されていなくても、ロックは常に悪い考えですか?ユースケースに依存しないベストプラクティスはありますか? 戦略についてどのような経験をしましたか?
編集:トランザクションを介してデータレベルで並行処理を処理することを認識しています。2人のユーザーが同時に複雑なデータ変更をトリガーすると、トランザクションが処理します。
しかし、GUIレイヤーでそれらを処理するか、少なくともそれらに反応することに興味があります。データの変更が、ユーザーの操作を伴う長時間の操作の一部である場合はどうなりますか?
2人以上のユーザーがWebインターフェースで同じファイルを編集しているとします。ある時点で、ユーザーの1人が保存ボタンを押します。他のユーザーに何が起こりますか?
- 通知やリロードを強制されますか?または、最終的に最初のユーザーの変更を上書きしますか?
- ファイルをロックして、複数のユーザーが同じファイルを編集できないようにしますか?
- 編集プロセス全体をトランザクションに入れることはできますか?
これと同様の状況に対処する最良の方法は何ですか?他の戦略はありますか?
解決
最良の戦略は、(ビジネス)プロセスの観点からすべきに依存します-また、重要な質問は、ユーザーが通常期待することと、最も驚かないこと、そしてもちろん、それが可能かどうかです彼らが期待するものを実装します。
ファイルを編集する Web経由の例は、次のように分類できます。
- user1チェック out / gets / downloads / opens file v0
- user2チェック out / gets / downloads / opens file v0
- user1は彼のコピーに変更を加えます ファイルv0
- user2は彼のコピーに変更を加えます ファイルv0
- user1はファイルバージョンv1をサーバーに保存します
- user2はファイルバージョンv2をサーバーに保存します
Webアプリケーション、および実際の通常のデスクトップオフィスプログラムでも一般的であることに注意してください。ユーザーが行った最新の変更は、保存後にのみ(他のユーザーに)使用可能になります。つまり、編集中のファイルのコピーに同僚のタイピングが表示されます。
これに対する古典的なバージョン管理アプローチは、user1の場合、通常のデスクトップ編集/保存プロセスと比較して何も変わらないということです。
ただし、user2がv2をサーバーに保存しようとすると、アプリケーションは、ユーザーが最後にダウンロードしてからファイルバージョンv0に変更があったかどうかを確認する必要があります。これが事実であるため、バージョン管理システムは通常、両方のバージョン(v1とv2)を画面に並べて表示し、それらを混合して、結果のバージョン(v3)をサーバーに保存します。
テキストファイルについては、UnixとWindowsの両方で、編集されたファイルの領域が重複しない場合に変更が自動的にマージされるようにプロセスを自動化しようとするツールとシステムが多数存在します。
代替方法は、user1が編集を完了するまでuser2のファイルをロックすることです。
トランザクションでの編集の入力は、通常は関係ありません。重要なのは、既存のファイルを新しいバージョンで上書きしようとする最後の操作です。編集は各ユーザーのワークステーションで独立して行われ、最後のポイント(保存)までサーバーにアクセスしません。
あなたの例は、ちなみに飛行機のチケットの予約や医師への予約のような他の状況とは明らかに異なります。
チケットを予約する際、飛行機の座席数には限りがあります。複数の人が飛行機の同じ最後の席に予約を入れるのは実際には瞬時ではないため、データ転送は可能です。
したがって、予約は少なくとも2段階のプロセスである必要があります:
- システムは空きスロットを表示します。
- ユーザーは空きスロットの1つを要求します (s1);
- システムはユーザーにスロットが まだ無料です。もしそうなら、 あなたにそれを予約します。
- ユーザーが予約を完了します。
「本当にまだ無料」はステップは、Webページのユーザービューの情報が通常リアルタイムで更新されないため、ステップ1と2の間に、別のユーザーが空きスロットを申請した可能性があります。
他のヒント
「トランザクション」の処理方法を探します。使用している言語/データベースAPIにかかわらず。これらを正しく設計すれば、自動的に処理されます。
理論を理解するには、 Couloris et al による分散システムですが、他にも優れた書籍がたくさんあります。