如何处理 EF Core 上的并发

Vit*_*ubs 2 .net c# 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;
}
Run Code Online (Sandbox Code Playgroud)

问题是:后台有多个任务FindOrCreate同时调用。我已通过创建唯一索引来防止插入重复项,但发生了以下情况,导致出现不需要的异常:

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

处理这些并发场景的适当方法是什么?我应该使用 C# 代码来处理锁吗?或者我应该设置交易吗?TIA

Ale*_*yny 5

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

不必费心锁定 C# 代码,一旦您有超过 1 台服务器运行您的应用程序,它就无法工作(现在很可能如此)。在这种情况下,交易是一件棘手的事情,所以我不会打扰。

如何处理这些异常:

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