让我们有一个带有 Id 和 Name 的假想表 Foo。我们对 Web 应用程序执行 2 个并行请求。两个请求都会处理一些逻辑,然后作为该逻辑的一部分,按名称检查表(foo.name == request.name)。如果数据库中不存在此条目,请创建它。
如果有 2 个请求尝试创建具有相同名称的相同条目,但只能存在一个这样的条目,您将如何解决这一问题?下面用伪代码来说明问题。
Process(Request request)
{
// some logic that takes around 3000ms
var foo = context.Foos.SingleOrDefault(f => f.Name == request.Name)
if (foo == null)
{
context = new Foo { Name = request.Name }
context.Foos.Add(foo)
}
car.Foo = foo;
context.Cars.Add(car);
context.SaveChanges()
}
您应该确保检查具有给定名称的
Foo
是否存在,如果不存在则创建它的操作。
您可以使用带有锁定机制的数据库事务:
Process(Request request)
{
using (var dbContextTransaction = context.Database.BeginTransaction())
{
try
{
// Some logic
var foo = context.Foos.SingleOrDefault(f => f.Name == request.Name);
if (foo == null)
{
foo = new Foo { Name = request.Name };
context.Foos.Add(foo);
}
car.Foo = foo;
context.Cars.Add(car);
context.SaveChanges();
dbContextTransaction.Commit();
}
catch (Exception)
{
dbContextTransaction.Rollback();
throw;
}
}
}