是否可以使用SQL Server进行此类锁定?

时间:2015-11-19 13:26:35

标签: sql-server entity-framework

我们有这个Web服务,使用以下算法(输入是id和名称)

public bool SetCustomer(int externalId,string name)
{           
    using (var db = new BusinessEntities())          
    {      
        var c = db.Customer.FirstOrDefault(c => c.externalId== externalId) ?? new Customer(){externalId = externalId};
        c.name =  name;
        db.SaveChanges();     
    }
}

问题是,如果某人同时调用具有相同ID的此Web服务,则会创建2个客户。

我们无法添加唯一约束,因为应用中的某些其他流程可能会创建具有相同externalId的客户。

我们考虑过一个带有对象字典的解决方案,它将用作锁定参数,但它看起来并不正确。

我们不想锁定整个表客户,因为我们有很多并行调用,所以这会导致超时。

2 个答案:

答案 0 :(得分:0)

您是否可以使用中间表来记录插入作业。

然后使用单线程任务完成作业(创建客户)。

如果您的网络方法必须返回结果,则可能需要异步解决方案。

甚至可以更加详细地说明Sql Service Broker中的异步触发器。

答案 1 :(得分:0)

我找到了一些东西:

http://michaeljswart.com/2011/09/mythbusting-concurrent-updateinsert-solutions/

它不是实体框架,但我不认为EF可以访问这类功能。

感谢