我有以下在网络花园中执行的代码(多个 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)
但我不喜欢将捕捉异常写成逻辑的一部分。