我们有这个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的客户。
我们考虑过一个带有对象字典的解决方案,它将用作锁定参数,但它看起来并不正确。
我们不想锁定整个表客户,因为我们有很多并行调用,所以这会导致超时。
答案 0 :(得分:0)
您是否可以使用中间表来记录插入作业。
然后使用单线程任务完成作业(创建客户)。
如果您的网络方法必须返回结果,则可能需要异步解决方案。
甚至可以更加详细地说明Sql Service Broker中的异步触发器。
答案 1 :(得分:0)
我找到了一些东西:
http://michaeljswart.com/2011/09/mythbusting-concurrent-updateinsert-solutions/
它不是实体框架,但我不认为EF可以访问这类功能。
感谢