我有以下在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)
但我不喜欢将捕捉异常作为逻辑的一部分。