2

ユーザー入力の同時実行を処理する良い方法は何ですか?

この質問への回答で既にデータベースのロックが除外されているため、一般的に同時ユーザー入力をどのように処理しますか?

行ロックによって実装されていなくても、ロックは常に悪い考えですか? ユースケースに依存しないベストプラクティスはありますか? あなたの戦略についてどのような経験をしましたか?

編集:トランザクションを介してデータレベルで同時実行を処理することを認識しています:2人のユーザーが同時に複雑なデータ変更をトリガーすると、トランザクションがそれを処理します。

しかし、GUIレイヤーでそれらを処理するか、少なくとも反応することに興味があります。データの変更が、ユーザーの操作を伴う時間のかかる操作の一部である場合はどうなりますか?

2 人以上のユーザーが Web インターフェイスで同じファイルを編集しているとします。ある時点で、ユーザーの 1 人が保存ボタンを押します。他のユーザーはどうなりますか?

  • 彼らは通知を受けたり、リロードを強制されたりしますか? それとも、最終的に最初のユーザーの変更を上書きしますか?
  • ファイルをロックして、複数のユーザーが同じファイルを編集できないようにしますか?
  • 編集プロセス全体をトランザクションに入れることはできますか (非常に疑わしいですが、誰にもわかりません...)

これと同様の状況を処理する最善の方法は何ですか? 他の戦略はありますか?

4

2 に答える 2

5

最善の戦略は、(ビジネス)プロセスの観点から何起こるかによって異なります。また、重要な質問は、ユーザーが通常何を期待し、何が最も驚かないか、そしてもちろん、ユーザーが期待することを実装できるかどうかです。

Web経由でファイルを編集する例は、次のように分類できます。

  1. user1はファイルv0をチェックアウト/取得/ダウンロード/開きます
  2. user2はファイルv0をチェックアウト/取得/ダウンロード/開きます
  3. user1は、ファイルv0のコピーに変更を加えます
  4. user2は、ファイルv0のコピーに変更を加えます
  5. user1はファイルバージョンv1をサーバーに保存します
  6. user2はファイルバージョンv2をサーバーに保存します

Webアプリケーション、そして実際には通常のデスクトップオフィスプログラムでも一般的であることに注意してください。ユーザーが行った最新の変更は、保存した後にのみ(他のユーザーが)利用できるようになります。つまり、同僚の入力が表示されることはありません。あなたが編集しているファイルのコピーであなたの上に。

これに対する古典的なバージョン管理アプローチは、user1の場合、通常のデスクトップ編集/保存プロセスと比較して何も変更されないというものです。

ただし、user2の場合、v2をサーバーに保存しようとすると、アプリケーションは、ユーザーが最後にダウンロードしてからファイルバージョンv0に変更があったかどうかを確認する必要があります。この場合、バージョン管理システムは通常、両方のバージョン(v1とv2)を画面に並べて表示し、それらを混合して、結果のバージョン(v3)をサーバーに保存します。

テキストファイルの場合、編集されたファイルの領域が重複しない場合に変更が自動的にマージされるように、プロセスを自動化しようとする多くのツールとシステムがUnixとWindowsの両方に存在します。

別の方法は、user1が編集を終了するまでuser2のファイルをロックすることです。

通常、編集をトランザクションに入れることは重要ではありません。重要なのは、既存のファイルを新しいバージョンで上書きしようとする最後の操作です。編集は各ユーザーのワークステーションで個別に行われ、最後のポイント(保存)までサーバーにアクセスしません。


ちなみに、あなたの例は、飛行機のチケットの予約や医者への予約など、別の状況とは明らかに異なります。

チケットを予約する場合、飛行機の座席数には限りがあります。複数の人が飛行機の同じ最後の座席に予約を入れるためにデータ転送が実際に瞬時に行われるわけではないという事実のために、それは可能です。

したがって、予約は少なくとも2段階のプロセスである必要があります。

  1. システムは空きスロットを表示します。
  2. ユーザーが空きスロット(s1)の1つを要求します。
  3. システムは、スロットが本当にまだ空いているかどうかをユーザーに通知し、空いている場合は予約します。
  4. ユーザーが予約を完了します。

「本当にまだ無料」の手順は、通常、Webページのユーザービューに関する情報がリアルタイムで更新されないためです。したがって、手順1と2の間に、別のユーザーが空きスロットを申請した可能性があります。

于 2008-12-30T14:09:07.683 に答える
2

使用している言語/データベース API で「トランザクション」を処理する方法を探します。これらを正しく設計すれば、それが処理されます。

理論を理解するには、Couloris らの Distributed Systems をお勧めしますが、他にも優れた本がたくさんあります。

于 2008-11-21T10:40:28.780 に答える