跨请求共享数据

问题描述 投票:0回答:1

让我们有一个带有 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()
} 
.net database entity-framework asp.net-core .net-core
1个回答
0
投票

您应该确保检查具有给定名称的

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;
        }
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.