1つの操作としてlinq-to-sql読み取りテストワイト
-
09-10-2019 - |
質問
私は持っています 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は、物事がどのようにロックされたか/方法を知らない(気にしない) - したがって、問題を複雑にしたり、デッドロックの可能性を増やすことはできません。
所属していません StackOverflow