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

时间:2010-11-12 16:11:37

标签: linq-to-sql database-concurrency

我有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 - 但我想确保没有更好的方法。

我知道这是一个非常基本的问题,但我无法找到明确答案。

1 个答案:

答案 0 :(得分:1)

如果您想确保在数据库中原子地发生这种情况(无论哪个线程或应用程序正在调用它),您可能应该在sproc中执行此操作并在那里锁定适当的级别。 sproc应该检索并更新记录,然后释放并返回它(Ack!我不是指TSQL return语句,但你知道我的意思是select它,我相信!)

因此,L2S只调用sproc并返回一个要处理的任务,已设置为Busy。 L2S既不知道(也不关心)锁定事物的方式/方式 - 因此不会使问题复杂化并为死锁提供更多机会。

相关问题