ASP.. NET MVC实体框架由于并发会话而创建副本



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

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

我已经尝试检查本地存储库再次,web服务返回后,但这是不足以捕捉这一切的时间;时间是这样的,似乎是同时发生的,所以我无法抓住它。

我的想法是以某种方式锁定第二个(和后续)用户(s)的方法,直到第一个请求返回,但我不确定如果a)这是一个好主意,和b)如果是,如何做到这一点?我正在考虑在数据库中创建一个临时标志并阻塞,直到它被清除,但有更好的方法吗?我能否以某种方式修饰c#方法,使一次只有一个会话可以访问它?

建议,有人知道吗?谢谢你!

你有一个非常明确的竞争条件,一个解决方案是使用一个锁定对象来控制对数据库读/写的访问

private static object syncObject = new object()
...
lock(syncObject)
{
    // exclusive DB access
}

锁一次只允许一个线程获得独占访问,这有效地消除了任何竞争条件。当第二个线程到达锁时,它将被阻塞,直到第一个线程完成。释放锁(一旦离开临界区,锁将自动释放)。

最新更新