1

Tasksテーブルがあります: Id (PK), TaskName, Status
Status は次のいずれかです: QueuedBusyComplete
複数のスレッドを使用してタスクを処理したいので、1 回の操作で実行できるようにする必要があります。

var task = db.Tasks.FirstOrDefault(t=>t.Status == (byte) TaskStatus.Queued);
task.Status = (byte) TaskStatus.Busy;
db.SubmitChanges();

明らかに、操作がアトミックでない場合、同時実行の問題が発生する可能性があります。Linq-to-Sql を使用して上記を行う意図的な方法 (存在する場合) は何ですか?

1) storproc または 2)db.ExecuteCommand("...")または 3) で競合を処理できることはわかっwith try/catchていますが、より良い方法がないことを確認したいと思います。

非常に基本的な質問であることは承知していますが、これに対する明確な答えを見つけることができませんでした。

4

1 に答える 1

1

これがデータベースでアトミックに発生していることを確認したい場合 (どのスレッドまたはアプリケーションが呼び出しているかに関係なく)、おそらく sproc で実行し、そこで適切なレベルでロックする必要があります。sproc は、レコードを取得して更新し、それを解放して返す必要があります (TSQLreturnステートメントのことを言っselectているのではありませんが、私は信頼しています!)。

したがって、L2S は単に sproc を呼び出して、作業するタスクを取得します。既に として設定されていBusyます。L2S は、何がどのようにロックされたかを知りません (または気にしません)。したがって、問題を複雑にし、デッドロックの可能性を高めることはできません。

于 2010-11-14T00:50:31.477 に答える