linq to-sql读取测试作为一个操作
-
09-10-2019 - |
题
我有 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既不知道(也不在乎)什么/是如何锁定的,因此无法使事情复杂化,也不会引入更多的僵局。
不隶属于 StackOverflow