2016-11-21 10 views
1

SQL Server 2012、ASP.NET 4.6.2、およびEF6を使用する。私はURLのテーブルを持っています。各URLは、API呼び出しを介して多数の第三者プロセスを経由しなければならず、その状態がそのテーブルに反映されます。私はそれらのプロセスを蹴るためにある種のスケジュールされたバックグラウンドプロセスを使用する予定です。EF6で行をロックする

行がテーブルに入ると、ステータスフラグはAwaitingProcessingで0になります。 1はInProgressを意味し、2はCompleteとなります。

全体の処理がより迅速になるように、これらの2つのプロセスを並行して実行する必要があります。さらに、これらのバックグラウンドプロセッサーのそれぞれに複数のインスタンスがあり、キューからURLを取得することがあります。

私はマルチスレッド処理には新しくなっているので、いくつかの矛盾した処理が進行することに少し気になります。

私ができることをしたいのは、Process1Runnerが現在進行中のアイテムとフラグだけを取るようにして、Process1runnerが別のProcess1runnerと同じ行を選択しないようにすることです。別のサードパーティサービスが通知URLにコールバックしたときに、2つのプロセスがProcess1StatusとProcess2Statusを同時に更新しようとすると、状態の更新が失われないようにしたいと思います。

私は2つの可能な関連の答えを見てきました:How can I lock a table on read, using Entity Framework?

と:Get "next" row from SQL Server database and flag it in single transaction

をしかし、私は私のニーズのために取るべきルートについてはあまり明確ではありませんよ。誰かが私を正しい方向に向けることができますか?正しい軌道にいるのですか?

+0

全体の処理がより迅速になるように---パフォーマンスを測定する方法は?それは本当にマルチスレッドを使用していない遅いですか? –

+0

@LeiYang是非、彼が質問で話していることは明らかです。 – mayu

+0

2番目のリンク(UPDATE ... OUTPUT)に記載されているアプローチで正確にどのような問題がありますか?これは私があなたの状況を正しく理解していれば行く方法です。 – Evk

答えて

-1

複数のアクターが同じ行のデータにアクセスする必要がある場合は、この状況を回避するためにデータを分割します。

私の最初の考えは、URLIdProcessId、およびStatusの列を使用してUrlProcessStatusテーブルを構築することを提案することです。このようにして、作業者は独立してデータを読み書きできます。

+0

これは同じ行を読む2人の労働者の問題を解決しません。 – Rob

+0

@Robこの解決策では、2人の作業者が同じ行を読む必要はありません。 – mayu

関連する問題