Linq-to-Sql Read-Test-Write作为一个操作

我有
Tasks
表:
Id (PK), TaskName, Status
状态是以下之一:排队,忙碌,完整。 我想使用多个线程来处理任务,为此我需要能够在一个操作中执行:
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
。 L2S既不知道(也不关心)锁定事物的方式/方式 - 因此不会使问题复杂化并为死锁提供更多机会。     

要回复问题请先登录注册