繁体   English   中英

如何在EF Core上处理并发

[英]How to deal with concurrency on EF Core

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

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

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

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

如何处理这些异常:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM