1

我有以下在网络花园中执行的代码(多个 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)

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

4

0 回答 0