首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microsoft Dynamics插件-并发更新

Microsoft Dynamics插件-并发更新
EN

Stack Overflow用户
提问于 2019-07-12 21:54:56
回答 2查看 1.7K关注 0票数 1

我有一个自定义实体,它几乎具有实时更新(大约每分钟更新1000次)。由于相同的实体记录可以在不同的批处理更新请求中得到更新,并且请求来自不同的异步源,因此CDS中较新的更新可能会被稍旧的更新覆盖。

  1. 更新-1(将自定义属性datamodifiedon设置为8.02PM)的实体记录A由异步服务S1处理。
  2. 由异步服务S2处理实体记录A的Update-2 (自定义属性datamodifiedon设置为8.03 PM)。

由于网络延迟或其他原因,S1服务稍慢,服务S2启动了对实体记录A的更新调用,并在8.03 PM上进行了数据处理

服务-1现在在同一实体记录上触发更新-1,而发生在8.03PM的更新会被在8.02PM发生的更新覆盖,导致数据丢失。

我已经在第10阶段(预验证)为我的自定义实体的Update消息注册了一个插件。此插件将输入参数中的datamodifiedon属性与来自插件上下文的预实体图像中的属性进行比较。并抛出无效的插件执行异常,如果预实体映像已经具有更多最新的datamodifiedon属性。

代码语言:javascript
复制
// If ModifiedOn value in pre-image is later than the one received in input parameters, this is an obsolete request and must be rejected.
if (preImage.Contains("datamodifiedon")
    && preImage.GetAttributeValue<DateTime>("datamodifiedon") != DateTime.MinValue
    && entity.Contains("datamodifiedon")
    && entity.GetAttributeValue<DateTime>("datamodifiedon") != DateTime.MinValue
    )
{
    if (DateTime.Compare(preImage.GetAttributeValue<DateTime>("datamodifiedon"), entity.GetAttributeValue<DateTime>("datamodifiedon")) > 0)
    {
        string traceMessage = "PreOperationLiveWorkItemUpdatePlugin: Update request is obsolete. datamodifiedon field found in pre-entity image: "
            + preImage.GetAttributeValue<DateTime>("datamodifiedon")
            + "datamodifiedon field in Input parameters: "
            + entity.GetAttributeValue<DateTime>("datamodifiedon");

        tracingService.Trace(traceMessage);
        throw new InvalidPluginExecutionException(traceMessage);
    }
}

由于更新非常频繁,是否有可能1.更新-2(数据更新8.03 PM)处于预验证阶段。成功验证后,数据库中的实际更新正在进行中。2.更新-1进入预验证阶段。由于更新-2尚未在数据库中提交,在此阶段收到的预实体映像是否仍然是旧值,并让验证通过?

由于其他两个阶段在相同的数据库事务中执行,在运行前或操作后阶段注册这个插件会有帮助吗?

还有其他方法来解决这个并发问题吗?由于更新是通过批处理odata调用启动的,因此不能在请求头中使用eTag预条件。

EN

回答 2

Stack Overflow用户

发布于 2019-07-12 23:59:28

您希望在操作前的步骤上注册这个插件。我认为您对预实体映像可能是脏的(我不确定在事务中是否检索了预映像)有一个合理的担忧,所以不要使用预映像检索记录的新副本,并检查检索到的记录的时间戳和目标上的时间戳。由于您的所有操作都是针对同一个表的同步事务,而且时间戳是该表上的一个字段,所以我认为这将保证没有脏写。

然而,

如果您的Update1和Update2操作更新了不同的字段,那么现在您可能会遭受反向数据丢失。如果Update1设置字段A和update2设置字段B,则如果在更新字段B之后处理字段A,则对字段A的更改将被忽略。

票数 0
EN

Stack Overflow用户

发布于 2019-07-13 02:48:17

您应该尝试使用乐观并发。如果您可以在更新行版本之前检查它。

乐观并发特性使应用程序能够检测从应用程序检索记录到尝试更新或删除该记录之间服务器上的实体记录是否发生了更改。

代码示例

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57014426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档