使用EF6锁定行

时间:2016-11-21 01:23:53

标签: c# sql-server multithreading entity-framework locking

使用SQL Server 2012,ASP.NET 4.6.2和EF6。我有一张网址表。每个网址必须通过API调用完成许多第三方进程,并且该状态反映在该表中。我计划使用某种预定的后台进程来关闭这些进程。我想出了一个像以下结构:

Id              int (PK)
SourceUrl       varchar(200)
Process1Status  int
Process2Status  int

当行进入表时,AwaitingProcessing的状态标志将为0。 1表示InProgress,2表示完成。

为了确保整体处理更快,我想并行运行这两个过程。此外,每个后台处理器可能有多个实例从队列中获取URL。

我是多线程处理的新手,所以我有点担心会有一些冲突的处理正在进行中。

我希望能够确保Process1runner不会选择与另一个Process1runner相同的行,方法是确保Process1Runner只接受1个项目并标记当前正在进行的项目。我还想确保当单独的第三方服务回调通知URL时,如果两个进程同时尝试更新Process1Status和Process2Status,则不会丢失状态更新。

我已经看到了两个可能的相关答案:How can I lock a table on read, using Entity Framework?

和:Get "next" row from SQL Server database and flag it in single transaction

但是我不清楚我应该采取哪种方式来满足我的需求。有人能指出我正确的方向吗?我是在正确的轨道上吗?

1 个答案:

答案 0 :(得分:-1)

如果设计多个actor需要访问同一行数据,我会拆分数据以避免这种情况。

我的第一个想法是建议使用UrlProcessStatusURLIdProcessId列构建Status表。这样,工作人员可以独立地读/写他们的数据。