3

ユーザー A は、チケット管理システムにログインして「SomePage.aspx」のコンテンツを編集します。

ユーザー B は 30 秒後にログインして、「SomePage.aspx」で同じチケットを編集します。

他の誰かが同じコンテンツを変更していることを各ユーザーに通知するための (3 層アーキテクチャでの) 最もよく知られている方法は何ですか?

4

5 に答える 5

8

HTTP のような要求/応答システムでは、ユーザーが現在何をしているかについての概念はあまりありません。他の誰かが「過去 2 分以内に」編集のためにチケットを開いた (またはそのような場合は開かないようにする) ことを彼らに通知できますが、それも禁止しない限り、ユーザー A は 30 分間編集できます。ユーザー A が編集用のアイテムを事実上「取得」したと信じているという事実をメモしておくことはできますが、Web アプリでは、ユーザーがコンピューターから離れて保存/キャンセルすることを止めるものは何もありません。

技術的な解決策について考える前に、技術的な制限(基本的に Web の非同期性と要求/応答の性質) について考え、望ましい動作を考え出すことをお勧めします。一般的な動作は次のとおりです。

  • 最初の編集者が勝ちます (基本的に、2 番目の編集者に変更が却下されたことを伝えます)
  • 2 番目の編集が優先されます (最初の編集を上書きします - 最初の編集者に伝えるには遅すぎます)
  • マージ (コンテンツによっては、非常に困難または不可能な場合があります)。これは、自動または手動 (2 番目の編集者の側) の場合があります。
  • 最初の人が編集している可能性があると思われる間は、2 人目の人が編集できないようにする (最初の段落で述べた問題のため、Web アプリにはほとんど適切ではありません)。
于 2008-10-24T07:33:41.337 に答える
2

Roundup は (たとえば) オプティミスティック コンカレンシー アプローチを使用します。変更を送信すると、他のユーザーが自分より前に変更を行っているという警告が表示され、その変更を示すページへのリンクが表示される場合があります。[送信] をクリックして変更を続行するか、フォームの値を編集してから送信することができます。

チケットには共有状態がほとんどないため、これはチケット システムでは問題なく機能します。ほとんどの場合、メッセージ ログ (または同等のもの) に追加するため、2 つのメッセージが次々に追加されます。

于 2008-10-24T15:04:42.973 に答える
1

私はこれについてあまり経験がありませんが、そのようなことをする必要がある場合は、EditingByというチケット テーブルのデータベースに新しいフィールドを作成し、デフォルト値の「0」を追加します。

ユーザーが TicketID = 897 を呼び出すと、クエリは次のようになります。

SELECT * FROM Tickets WHERE TicketID = 897; 
UPDATE Tickets SET EditingBy = @UserID WHERE TicketID = 897;

コードで、EditingBy が 0 より大きいかどうかを確認すると、UserA (UserID を知っている) がチケットを編集していることを UserB に警告できます。SO が誰かが回答を投稿し、あなたが自分の回答を書いているとき、またはたとえば、新しいバッジ。

更新のためにチケットをコミットすると、フィールドを更新して 0 に戻すことができます。

ユーザーが SomePage.aspx に入り、何もせずに離れることができることをお勧めします。そのため、body タグのjavascript onUnloadにより、非同期呼び出しをトリガーして EdittingBy を 0 に更新することが考えられます。

これがあなたにそれをすることについてのアイデアを与えることを願っています.

編集済み: データベース自体を編集できない場合は、いつでも XML ファイルに EditingBy を記録できます。TicketID と UserID を保持し、0 より大きいかどうかを調べる代わりに、TicketID が XML にあるかどうかを確認します。

于 2008-10-24T07:40:53.677 に答える
1

オプティミスティック同時実行を防止するために私が見つけた最善の方法は、データベース Eg:SQLTimeStamp にタイムスタンプと呼ばれるフィールドを追加することです。このフィールドは、テーブル内の各レコードの一意の値を維持します。ユーザー A が編集のためにテーブルにクエリを実行すると、sqltimestamp 値がセッションに保存されます。ユーザー B がユーザー A の前に同じレコードを照会および更新すると、SQL タイムスタンプ値が変更されます。ユーザー A が編集した値を保存しようとすると、まずセッション スタンプがデータベースの現在のタイムスタンプと同じかどうかを確認し、タイムスタンプが異なる場合は、誰かがレコードを変更したことをユーザーに知らせます。

これは、私が Web アプリケーションに使用するソリューションです。

于 2011-07-15T12:38:37.670 に答える
0

ヘルプ デスク チケットか、一度に 1 人のユーザーだけが作業する必要がある類のものについて話していると思います。この場合、最初のユーザーがチケットをチェックアウトすると、チケットのステータスが変更されます。

于 2008-10-24T07:37:02.547 に答える