linq可以原子地更新和查询吗?

时间:2009-03-13 14:54:41

标签: linq atomic

我需要从数据库中获取1000行,同时将它们标记为“进行中”。 这样,另一个线程也不能采用相同的1000行并处理它们。

使用linq,我会这样做:

msgs =(来自database.messages中的m         where(m.status == MESSAGESTATUSINIT)         选择m)。取(1000).ToList();

理想情况下,我会同时将状态设置为MESSAGESTATUSPROCESSING。当然这必须是原子的。

任何想法?还是回到SQL?

谢谢!

3 个答案:

答案 0 :(得分:4)

你不能在linq2sql中这样做。使用存储过程,并在设计器上对其进行配置以输出Message。这样,您就可以操作已加载的实体并正常提交更改。

检查这个怎么做(特别是将SPROC方法的返回类型映射到数据模型类): http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx

答案 1 :(得分:1)

Linq本身不会提供这种能力;请记住Linq ==查询。数据更新发生在其他地方。

在这种情况下,编写存储过程以返回结果可能会更好; sproc可以更新表并以原子方式返回结果,然后您的应用程序将只有一个调用。

答案 2 :(得分:0)

您可以使用锁定{}来包围代码。

Lock Keyword