我有 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既不知道(也不在乎)什么/是如何锁定的,因此无法使事情复杂化,也不会引入更多的僵局。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top