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
をしかし、私は私のニーズのために取るべきルートについてはあまり明確ではありませんよ。誰かが私を正しい方向に向けることができますか?正しい軌道にいるのですか?
全体の処理がより迅速になるように---パフォーマンスを測定する方法は?それは本当にマルチスレッドを使用していない遅いですか? –
@LeiYang是非、彼が質問で話していることは明らかです。 – mayu
2番目のリンク(UPDATE ... OUTPUT)に記載されているアプローチで正確にどのような問題がありますか?これは私があなたの状況を正しく理解していれば行く方法です。 – Evk