1

我有Tasks表:Id (PK), TaskName, Status
状态是以下之一:QueuedBusyComplete
我想使用多个线程来处理任务,为此我需要能够在一个操作中完成:

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来做到这一点 - 但我想确定没有更好的方法。

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

4

1 回答 1

1

如果您想确保这在数据库中以原子方式发生(无论是哪个线程或应用程序调用它),您可能应该在存储过程中执行此操作并锁定在适当的级别。sproc 应该检索和更新记录,然后释放并返回它(确认!我不是指 TSQLreturn语句,但你知道我是认真的select,我相信!)

所以 L2S 只是调用 sproc 并返回一个要处理的任务,已经设置为Busy. L2S 既不知道(也不关心)什么/如何锁定 - 因此不会使事情复杂化并引入更多的死锁机会。

于 2010-11-14T00:50:31.477 回答