如何在多进程环境中安全地创建与Entity Framework的唯一关系?

时间:2013-11-21 18:40:32

标签: c# entity-framework transactions worker-process

我有以下在Web园中执行的代码(多个ASP.NET工作进程)以获得良好的性能。除了这段代码片段,一切都很好。

UserTaskRelation上有唯一的索引,这是我的代码......

// There is Unique Index for TaskID and UserID
var t = db.UserTaskRelations.FirstOrDefault(
            x=> x.TaskID == taskID 
                && x.UserID == userID);
if(t==null){
    t = new UserTaskRelation { TaskID=taskID, UserID = userID };
    db.UserTaskRelations.AddObject(t);
}
t.LastUpdated = DateTime.UtcNow;
db.SaveChanges();

当同一用户点击同一任务的刷新页面时,此代码在最后一行失败,而前一个请求仍在队列中,其中一个请求失败。

由于这是在多进程环境中执行的,因此锁定无助于使用互斥锁进行锁定也无济于事,因为我们有多个Web服务器执行相同操作。

我把这一切都包含在这样的交易......

using(TransactionScope scope = new TransactionScope(
          TransactionScopeOption.Required))
{

    // all of above code here...

    scope.Complete();
}

这仍然没有帮助...在100次操作中,我看到1-5%的操作失败。反正有安全插入这个,如存储过程等?

我目前正在做一个肮脏的解决方法...

1. Try Logic
2. Catch Exception
3. Try Get Logic (assuming it exists)

但我不喜欢将捕捉异常作为逻辑的一部分。

0 个答案:

没有答案