2010-11-12 21 views
1

我有Tasks表:Id (PK), TaskName, Status
状态为之一:排队完成
我想用多线程来处理任务,为此,我需要能够在一个操作中要做到:LINQ到SQL READ试验写为一个操作

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

如果你想确保这是在数据库中原子性地发生的事情(不管线程或应用程序调用它),你可能应该在一个存储过程中做到这一点,并锁定在适当的级别。该存储过程应检索和更新记录,然后释放并返回(ACK!我说的不是TSQL语句return,但你知道我的意思是select它,我相信!)

所以L2S只是调用存储过程的和取回工作,已设置为Busy。 L2S既不知道(也不在乎)事物是如何锁定的 - 因此不能使问题复杂化,并为僵局提供更多机会。