如何防止队列项被处理两次

时间:2016-03-31 16:21:46

标签: c# entity-framework entity-framework-6

对Sql Server 2014使用Entity Framework 6,我得到一个要处理的项目列表,其StatusId为1.处理完每个项目后,它将以状态2保存,因此不会再次处理。处理可能需要几分钟。

然而,这不是“Threadsafe”所说的。换句话说,如果代码在第一个完成之前再次启动(例如通过不同的进程),则项目的状态仍为1,因此它再次在队列中结束并再次处理。

如何获取要处理的记录并确保第二次不检索这些记录?例如,是否可以在事务中检索数据并更新状态?

1 个答案:

答案 0 :(得分:1)

您可以在transaction语句中包装EF lock,以确保在任何给定时间只有一个线程正在访问处理逻辑。

  

lock 关键字将语句块标记为关键部分   获取给定对象的互斥锁,执行a   声明,然后释放锁。

private void ProcessEntities(IEnumerable<Entity> entities)
{
    lock (processLock)
    {
        using (var transaction = SomeDbContext.Database.BeginTransaction())
        {
            try
            {
                // process...
                // ...
                SomeDbContext.SaveChanges();
                transaction.Commit();
            }
            catch (Exception e)
            {
                transaction.Rollback();
                Log(e);
                throw;
            }
        }
    }
}