2011-11-07 9 views
4

私は多くの従業員が顧客の苦情を解決するためにシステムにログインできるアプリケーションに取り組んでいます。ある従業員が不満のために「スタート」ボタンをクリックすると、そのレコードはフリーズする必要があります。フリーズすると、他の従業員の画面に表示されるべきではないということです(Ajaxを使用して画面が更新されるとき)。さらに、それは特定の期間だけ現れてはならない。従業員が数分以内に苦情に応答しない場合、苦情の列に再度表示されます。レコードのロック

この期間はどのように管理しますか?ユーザーが「開始」をクリックすると、そのアイテムをキャッシュオブジェクトに格納することができ、有効期限が来るまで有効です。その後、他の従業員の画面が更新されたときには、出席していないアイテムやキャッシュに存在しないアイテムのみが表示されます。それがキャッシュに存在する場合、それは誰かが出席していることを意味します。私は正しい道を進んでいますか?それとももっと良い方法がありますか?

答えて

2

あなたができることの1つは、データベースに「ロック」列を持ち、その列をDateTime列にすることです。

ユーザーが[開始]をクリックすると、その列の時刻が記録されます。

表示するレコードを取得するとき、ロック列にnull以外の値を持つもの、またはロック列の値が少なくともx分前のものを除外します(これは、GetDate ) 関数)。

+0

ニース。私は解決策が好きだった。不要なタイマーなどに落ちることなく、私が読んだ最もエレガントなもの – Jaggu

2

これを行う最も簡単な方法は、 'RecordStatus'という名前の列を作成することです。この列には、まだ作成または変更中であることを示す特別な値を設定できます。

これにより、すべてのクエリを変更して、そのステータスのレコードを除外しますが、長期的には、データベースまたはアプリケーションレベルの論理ロックよりも優れており、より信頼性が高くなります。

+1

レコードをロードするユーザーがレコードを解放しない場合はどうなりますか?どのようにSession_Endが発射することが保証されていないという事実を考慮して、データベースにasp.netアプリケーションのレコードを自動解放するように通知しますか?私はあなたのアプローチが正しい軌道にあると思っていますが、もっとやり方があります。 – Icarus

+0

それはいつも問題です。私たちは毎日実行されるバッチジョブを持っていて、「下書き」モードで残っているレコードを見て、それらを核にします。 – kprobst

+0

あなたの応答は私にも影響を与えました。時間ベースのロックの有効な解決策は、ロック列をboolの代わりにDateTime(NULLを許可)にすることです。これは、x分前に設定されたnullロックまたはロックに基づいて取得できます。 – Jeff

1

"レコードロック" DBレコードのバリエーションを使用して、2つの状況で独立して私の会社でこれを解決しました。あるシステムでは、レコードが新しい項目として「キュー」に入ったときにロックレコードが作成されます。もう1つは、ユーザーがキューからレコードを取得したときにロックレコードが作成されます。

ソフトウェアのユーザーコピーが作業用のキューレコードを開くときに、ロックされたレコードがDBに書き込まれ、そこに書き込まれたユーザーに関する一意の識別情報があるはずです。ロックされているレコードとロックレベル(同じレベルの2つのロックが同じレコードに存在しないことを意味する)が一意である必要があります。また、レコードを開いたユーザーを変更の目的で「所有」する。このロックレコードは、ユーザーが自分のソフトウェアでレコードを開いている間は保持されます。

ロックを「中断する」機能は、元のロックしているユーザーのソフトウェアによるロックオブジェクトの定期的なポーリングと組み合わせて、別のユーザーにロックを再割り当てするだけで実現できます。ユーザが所有者ではなくなった場合、ロックが「壊れている」場合、ユーザはロックを再取得する(他のユーザの新しいロックを解除する)か、単に移動するか選択できます。

ユーザーのソフトウェアがクラッシュした場合でも、レコードにはまだロックが設定されています。また、ロックを解除する操作が失敗することもあります(これは、実際のデータが別のDBにあり、汎用トランザクションを実行できない状況で発生する可能性があります)。そのような場合、「孤立した」ロックを削除する、またはユーザーに強制的にロックを解除するためのメカニズムが必要になります。ロックされているアイテムが時間に敏感な場合は、複数の冗長レベルのロック除去を設計する必要があります(おそらく、分単位でX分より古いロックを破棄する、または孤立していることが知られているタイムジョブそのユーザーはもうログインしていません)。

関連する問題