如何在EF Core上处理并发

时间:2019-01-30 13:22:27

标签: c# .net entity-framework

我有一种方法可以搜索数据库中的实体,如果不存在则尝试创建它。例如:

public async Country FindOrCreate(string name)
{
    var country = _context.Countries.FirstOrDefault(p => p.Name == name);

    if (country != null)
        return country;

    country = new Country
    {
        Name = name
    };

    _context.Countries.Add(country);
    _context.SaveChanges();

    return country;
}

问题是:后台同时调用FindOrCreate有多个任务。我通过创建唯一索引来防止插入重复项,但是会发生以下情况,从而导致意外的异常:

  1. 任务A尝试查找国家/地区失败
  2. 任务B试图找到国家并失败
  3. 任务A尝试创建国家并成功
  4. 任务B尝试创建国家/地区并失败

处理这些并发方案的合适方法是什么?我应该使用C#代码处理锁吗?还是应该进行交易? TIA

1 个答案:

答案 0 :(得分:3)

使用唯一索引在数据库级别处理并发是正确的方法。唯一索引无论如何都将保证国家的唯一性。

不要费心锁定C#代码,一旦有超过一台服务器运行您的应用程序(这可能是几天),它就不会起作用。在这种情况下,交易是tricky business,所以我不会打扰。

如何处理这些异常:

如果创建国家/地区时任务失败,请捕获异常并重试。如果由于某种原因第二次无法获得该国家/地区,请记录该异常并失败。