RIA真的存在并发问题吗?

时间:2011-06-10 02:13:10

标签: c# silverlight-4.0 wcf-ria-services

在我所指的复数形式的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?默认情况下,模式设置为“无”。

提前致谢:)

1 个答案:

答案 0 :(得分:2)

这是因为Stale Read引起的竞争条件。请考虑以下事项:

  1. 两个客户端获得Prospect的副本 - 让我们称之为版本1
  2. A修改LastUpdate属性,对象现在是版本2
  3. 保存Prospect
  4. B修改LastUpdate属性。对于客户B,版本现在是版本2 但客户B的版本2与客户端A的
  5. 不同
  6. B保存Prospect - 这会覆盖客户A的更改!
  7. 这里的问题是B不知道A做了任何改变。抛出Exception以防止竞争条件意外删除数据。

    解决方案是捕获此异常并报告Prospect在编辑时已更改,然后重新加载。

    您可以找到有关使用ConcurrencyMode=fixed here

    的更多信息