[英]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
。 我已通过创建唯一索引来防止插入重复项,但是会发生以下情况,从而导致意外的异常:
处理这些并发方案的合适方法是什么? 我应该使用C#代码处理锁吗? 还是应该进行交易? TIA
在这里,使用唯一索引在数据库级别处理并发是正确的方法。 唯一索引无论如何都将保证国家的唯一性。
不要费心锁定C#代码,一旦您有多台服务器运行您的应用程序(这可能是几天),它就不会起作用。 在这种情况下,交易是一件棘手的事情,所以我不会打扰。
如何处理这些异常:
如果创建国家/地区时任务失败,请捕获异常并重试。 如果由于某种原因第二次无法获得该国家/地区,请记录该异常并失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.