0

ユーザー向けのタスクのプールがあるasp.net WebフォームでWebアプリケーションを作成しましたが、いくつかのジレンマがあります。ユーザーがあるタスクを選択すると、別のユーザーが同じタスクを選択できないようにする必要があります。

私の実際のアイデアは、日付「期間」の列をテーブル(SQLサーバー)に追加し、ユーザーが作業中に更新されるタスクと列「ビジー」を追加することです。バックラウンドでは、この日付を毎回更新するスレッドが機能します。5 分間、一度「ビジー」を 1 に設定します (ユーザーがタスクでサイトを開いたときに開始されます)。

データベースには、すべてのexを開始するジョブがあります。7分、「期間」の日時が5分より古い場合、列「ビジー」を0に設定すると、タスクがプールに戻ってきます。

そのため、ユーザーがタスクの作業を終了すると、ジョブはしばらくしてからそれをプールにプッシュします。もちろん、ユーザーはいくつかのボタンをクリックして、ビジー o を 0 に設定できます。誰かが作業している間はそのタスクを利用できないようにしたいと考えています。それが良いアプローチかどうかはわかりません。たぶん、誰かがこの状況を経験したことがあります。

4

2 に答える 2

0

これはまったく良い方法ではありません。

まず、単純なものに対して複雑すぎるソリューションを作成しています。

タスクの状態を定義することから始めます...例:

  • 保留中
  • ビジー (ユーザーが開いて作業を開始したとき)
  • 終了した

ユーザーがタスクを開いたときに、タスクを直接 [Busy] に更新するだけで済みます。Update ステートメントを呼び出すと、データベースは 1 つのクライアントのみがテーブルの状態を変更することに耐えます。

次に、行数を取得し、それが 1 の場合は、タスクの所有権を取得します。この場合のみ、タスク情報を返します。それ以外の場合は、エラーを発生させます。

ASP.NET でこのエラーを処理する必要があります。

例えば:

UPDATE MY_TASKS SET STATUS = 'Busy' WHEN TASK_ID = 'some-id' AND TASK_STATUS <> 'Busy'

IF @@ROWCOUNT = 1
BEGIN
    SELECT * FROM MY_TASKS WHERE TASK_ID = 'some-id'

END
ELSE
BEGIN
    RAISERROR('Another user is working on this task', 16, 1) 
END

このコードを好きなように装飾したり、最大期間を設定したり、より多くの状態を作成したり、有限状態マシンのように状態間の遷移を制御したりできます...ただし、原子爆弾でハエを殺そうとしないでください。

于 2012-12-27T11:19:21.560 に答える
0

良いアプローチではないと思います。

あなたがしているタスクは、基本的に機能を実装するための回避策です。これをクライアントに提供する場合、大きな問題はありません。

テーブルのロックを使用することをお勧めします。これを確認して ください http://msdn.microsoft.com/en-us/library/aa213026(v=sql.80).aspx

また、コードでデータベースをいじっている場合は、トランザクションを使用することを強くお勧めします。

于 2012-12-27T11:02:05.217 に答える