【问题标题】:How to prevent queue items from being processed twice如何防止队列项目被处理两次
【发布时间】:2016-03-31 16:21:46
【问题描述】:

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

但是,这不是所谓的“线程安全”。换句话说,如果代码在第一个完成之前再次启动(例如由不同的进程),则项目的状态仍然是 1,所以它再次进入队列并被第二次处理。

我怎样才能得到要处理的记录并确保它们不会被第二次检索?例如,是否可以检索数据并更新 Transaction 中的状态?

【问题讨论】:

  • 为什么不创建第三个状态“处理中”并在工作开始时设置它。
  • lock 和/或 DbContext.Database.BeginTransaction() ?
  • @entropic 我喜欢将这个想法与交易相结合。

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


【解决方案1】:

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

lock 关键字将语句块标记为临界区 获取给定对象的互斥锁,执行 语句,然后释放锁。

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;
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2020-05-19
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2012-04-28
    相关资源
    最近更新 更多