【问题标题】:Are there really any concurrency issues with RIA?RIA 真的有任何并发​​问题吗?
【发布时间】:2011-06-10 02:13:10
【问题描述】:

在我提到的 Pluralsight 的 RIA 服务视频之一中,他们有这样的更新代码:

public void UpdateProspect(Prospect currentProspect)
{
    currentProspect.LastUpdate = DateTime.Now;
    ObjectContext.Prospects.AttachAsModified(currentProspect, ChangeSet.GetOriginal(currentProspect));
}

我的第一个问题是此更新将如何导致问题?为了显示问题,他启动了两个 Silverlight 客户端,然后从第一个客户端更新了项目,并且更新得很好。然后他转到第二个客户端并进行更新并引发错误。

为什么 RIA 会抛出错误?和第一次更新有什么关系?我认为这确实是错误的,我们需要再次编写一些特殊的代码来解决 EntityConflict,然后再次将批处理提交到服务器。这样合适吗?

他还将 ConcurrencyMode 设置为 Fixed。我的第二个问题是您何时将 ConcurrencyMode 设置为 Fixed?默认情况下,模式设置为无。

【问题讨论】:

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


    【解决方案1】:

    这是由于过时读取引起的竞争条件。考虑以下几点:

    1. 两个客户获得Prospect 的副本 - 我们称之为版本 1
    2. A 修改了LastUpdate 属性,对象现在是版本2
    3. A 保存Prospect
    4. B 修改LastUpdate 属性。对于客户 B,版本现在是第 2 版但客户 B 的第 2 版与客户 A 的不同
    5. B 保存 Prospect - 这将覆盖客户端 A 的更改!

    这里的问题是 B 不知道 A 做了什么改变。抛出异常是为了防止竞态条件意外删除数据。

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

    你可以找到更多关于使用ConcurrencyMode=fixedhere的信息。

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 2021-06-22
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      相关资源
      最近更新 更多