質問

私は持っています Tasks テーブル: Id (PK), TaskName, Status
ステータスは次のとおりです。 キュー, 忙しい, 完了.
複数のスレッドを使用してタスクを処理したいので、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 - しかし、私はより良い方法がないことを確認したいです。

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

役に立ちましたか?

解決

これがデータベースで原子的に起こっていることを確認したい場合(スレッドやアプリケーションがそれを呼び出しているものに関係なく)、おそらくSPROCでそれを行い、適切なレベルでロックする必要があります。 SPROCはレコードを取得して更新し、それをリリースして返す必要があります(ACK!TSQLを意味しません return 声明、しかしあなたは私が意味することを知っています select それ、私は信頼しています!)

したがって、L2SはSPROCを呼び出して、取り組むタスクを取り戻します。 Busy. 。 L2は、物事がどのようにロックされたか/方法を知らない(気にしない) - したがって、問題を複雑にしたり、デッドロックの可能性を増やすことはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top