EF Linq一步选择并更新或反之亦然

时间:2015-01-08 08:21:30

标签: c# linq entity-framework ef-code-first

我的情况是我有多个异步Windows服务。 所有人都在使用一张桌子"乔布斯"。让我们用两列来说:" Id"和#34;加载"

在此表中有50个工作 我现在想要的是,这项服务每次只有10个工作并且可以使用它们。

但是,作业不会被处理两次非常重要。 这些服务只能抓住“加载”的工作岗位。是空的。

如果现在"服务A"来加载前10个工作岗位" Loaded"是null可能需要5秒。 并在这5秒内。 "服务B"来,并加载10个工作,这个工作将是相同的。 (危险!)

为了避免双重处理的作业,我现在要做的是加载10个作业并在一个语句中更新它们("加载"到DateTime.UtcNow)或更新它们并加载受影响的作业在一个声明中。

但我不知道这是否可行。 有人能帮助我吗?

亲切的问候

2 个答案:

答案 0 :(得分:0)

我认为你可以做这样的事情

   list.Where(j => j.Loaded == null).Take(10).AsEnumerable()
                .Select(x =>
                {
                    x.Loaded = DateTime.UtcNow;
                    db.SaveChanges();
                    return x;
                })
                .ToList().ForEach(j => //proccess job here);

答案 1 :(得分:0)

您遇到并发数据库访问问题。您的目的是更新使用标志读取的每个作业,以便不再处理它。想到两个想法:

  • 独占数据库访问您只允许一个Windows服务一次读取和更新它读取的记录。这将确保不会两次处理作业。
  • 阅读所有项目每次都阅读所有可用的作业,然后将它们分发到每个Windows服务。您必须在读取作业的应用程序和Windows服务之间实现某种形式的数据共享。这个想法使您可以更好地控制每个服务处理的工作。