我有一种方法可以搜索数据库中的实体,如果不存在则尝试创建它。例如:
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
答案 0 :(得分:3)
使用唯一索引在数据库级别处理并发是正确的方法。唯一索引无论如何都将保证国家的唯一性。
不要费心锁定C#代码,一旦有超过一台服务器运行您的应用程序(这可能是几天),它就不会起作用。在这种情况下,交易是tricky business,所以我不会打扰。
如何处理这些异常:
如果创建国家/地区时任务失败,请捕获异常并重试。如果由于某种原因第二次无法获得该国家/地区,请记录该异常并失败。