使用乐观并发减少潜在的数据丢失

 

发布日期: 2017年1月

适用于: Dynamics 365 (online),Dynamics 365 (on-premises),Dynamics CRM 2016,Dynamics CRM Online

在一个如同 Microsoft Dynamics 365 的多线程和多用户的系统中,操作和数据更改通常并行。 当对同一组数据同时进行两个或更多更新和删除操作时,问题就会出现。 这种情况可能导致数据丢失。 SDK 版本中所提供的是您的应用程序的检测能力,在您的应用程序开始检索记录与它尝试更新或删除记录期间,就已开始检测是否服务器上的某个实体记录被更改。

乐观并发在针对脱机同步启用的所有现成实体和所有自定义实体上不受支持。 通过 SDK 调用检索实体的元数据,或通过使用元数据浏览器查看元数据,可以确定实体是否支持乐观并发,同时还可以检查属性 IsOptimisticConcurrencyEnabled 是否设置为 true。 对于自定义实体,该属性默认设置为 true。若要查看您的组织的实体元数据,请安装浏览组织的元数据中描述的元数据浏览器解决方案。 您还可以在一个名为 EntityMetadata.xlsx 的 Excel 文件中查看非自定义组织的元数据,该文件包含在 SDK 下载的顶级文件夹中。

本主题内容

启用乐观并发

更新或删除记录

处理异常

启用乐观并发

您可以在执行 UpdateRequest 时通过将请求的 ConcurrencyBehavior 属性设置为 IfRowVersionMatches 来启用乐观并发检查行为。 同样,对于 DeleteRequest,则会设置 ConcurrencyBehavior 属性。

当使用组织服务上下文使数据更改时,请设置 OrganizationServiceContext 对象的 ConcurrencyBehavior。 当 SaveChanges 被调用时,此值将被传递到 OrganizationServiceContext 使用的所有 UpdateRequestDeleteRequest 消息。

乐观并发行为只能通过 SDK 调用设置。 目前没有 Web 应用程序形式的设置。

更新或删除记录

在检索实体记录之后,请访问 RowVersion 属性获取该记录的当前版本。 在您用作 UpdateRequest 中的 Target 的实体对象中,将 RowVersion 属性设置为来自检索记录的相同值并执行请求。 同样,在您用作 DeleteRequest 中的 Target 实体参考对象中,将 RowVersion 属性设置为来自检查记录的相同行版本值并执行请求。

如果传递到 UpdateRequest 的实体包含相关实体,则相同行为将使用每个实体提供的行版本被应用到所有更新操作。

在平台接收请求时,将执行当前实体记录行版本和此行版本的比较。 如果行版本匹配,且 ConcurrencyBehavior 设置为 IfRowVersionMatches,操作成功。 否则,将返回错误异常。

处理异常

使用乐观并发时,有几种错误条件可能从 Web 服务调用返回到 FaultException<OrganizationServiceFault>。

  • ConcurrencyVersionMismatch (code=-2147088254)

    当提供行版本时,且指示了 IfVersionMatches 行为,如果现有记录的版本不匹配请求提供的行版本,则会返回错误。

  • ConcurrencyVersionNotProvided (code= -2147088253

    当指示 IfVersionMatches 行为时,且不提供行版本的值,则会返回错误。

  • OptimisticConcurrencyNotEnabled (code=-2147088243)

    当在更新中将 IfVersionMatches 行为指示到实体时,并且未启用乐观并发,则会返回错误。

您可以检查返回的错误的代码属性可确定错误是否与乐观并发相关。 从 ErrorCodes.cs 帮助程序代码获取之前显示的错误条件代码。

另请参阅

在服务器上扩展 Microsoft Dynamics 365
示例:使用有关更新和删除操作的乐观并发

Microsoft Dynamics 365

© 2017 Microsoft。 保留所有权利。 版权