ASP.NET MVC实体框架由于并发会话而创建重复项

ASP.NET MVC实体框架由于并发会话而创建重复项,asp.net,asp.net-mvc,entity-framework,Asp.net,Asp.net Mvc,Entity Framework,我的应用程序从web服务检索主题信息,并将其插入本地数据库。创建主题时,还将创建关联的作业。首先检查本地存储库以查看该作业是否存在;如果没有,则为该作业发出另一个web服务请求,然后该请求也保存到本地存储库中 问题是,偶尔会创建重复作业,因为两个用户同时登录,两个主题共享同一作业。对于第一个,作业不存在,因此从服务中检索并创建它;对于第二个请求,作业不存在,但它是在第二个请求的web服务调用返回之前由第一个请求创建的。这样就创建了副本 在web服务返回后,我尝试再次检查本地存储库,但这还不足以始

我的应用程序从web服务检索主题信息,并将其插入本地数据库。创建主题时,还将创建关联的作业。首先检查本地存储库以查看该作业是否存在;如果没有,则为该作业发出另一个web服务请求,然后该请求也保存到本地存储库中

问题是,偶尔会创建重复作业,因为两个用户同时登录,两个主题共享同一作业。对于第一个,作业不存在,因此从服务中检索并创建它;对于第二个请求,作业不存在,但它是在第二个请求的web服务调用返回之前由第一个请求创建的。这样就创建了副本

在web服务返回后,我尝试再次检查本地存储库,但这还不足以始终捕捉到这一点;时间如此之长,以至于它似乎同时发生,所以我无法捕捉它

我的想法是在第一个请求返回之前,以某种方式将第二个(以及随后的)用户锁定在方法之外,但我不确定a)这是否是个好主意,b)如果是,怎么做?我想在数据库中创建一个临时标志,并在清除它之前进行阻塞,但是有更好的方法吗?我能否以某种方式修饰C#方法,以便一次只能有一个会话访问它

有人给我建议吗?谢谢大家!

有一个非常清楚的解决方案,就是使用锁定对象来控制对数据库读/写的访问

private static object syncObject = new object()

...
lock(syncObject)
{
    // exclusive DB access
}
锁一次只允许一个线程获得独占访问权,这将有效地否定任何竞争条件。当第二个线程命中锁时,它将被阻塞,直到第一个线程完成并释放锁为止(一旦您离开关键部分,锁将自动释放)


有关详细信息,您可以阅读有关工作原理的信息。

该作业是否有唯一标识符?谢谢!工作起来很有魅力。很明显,既然你提到了种族状况。。。