在我所指的复数形式的RIA服务视频中,有一个更新代码如下:
public void UpdateProspect(Prospect currentProspect)
{
currentProspect.LastUpdate = DateTime.Now;
ObjectContext.Prospects.AttachAsModified(currentProspect, ChangeSet.GetOriginal(currentProspect));
}
我的第一个问题是此更新将如何导致问题?为了显示问题,他启动了2个silverlight客户端,然后从第一个客户端更新项目并且它很好地完成了。然后他去第二个客户端并进行更新,它会抛出一个错误。为什么RIA会抛出错误?它与第一次更新有什么关系?我认为这真的很麻烦,我们需要再次编写一些特殊代码来解析EntityConflict,然后再次将批量提交给服务器。这个合适吗?
哦,我忘了他将ConcurrencyMode设置为Fixed。我的第二个问题是你什么时候将ConcurrencyMode设置为Fixed?默认情况下,模式设置为“无”。
提前致谢:)
答案 0 :(得分:2)
这是因为Stale Read引起的竞争条件。请考虑以下事项:
Prospect
的副本 - 让我们称之为版本1 LastUpdate
属性,对象现在是版本2 Prospect
LastUpdate
属性。对于客户B,版本现在是版本2 但客户B的版本2与客户端A的 Prospect
- 这会覆盖客户A的更改!这里的问题是B不知道A做了任何改变。抛出Exception以防止竞争条件意外删除数据。
解决方案是捕获此异常并报告Prospect
在编辑时已更改,然后重新加载。
您可以找到有关使用ConcurrencyMode=fixed
here。