CRM 2011多个插件同时触发,检索无效数据

时间:2015-07-22 23:21:33

标签: plugins dynamics-crm-2011 crm

我正在开发Dynamics CRM 2011,我创建了订单产品创建插件(后期操作)以及订单产品删除插件(预验证)。

创建订单产品时,我的插件会检索父记录并根据订单产品数量更新数量字段。 删除订单产品时,我的删除插件会将其反转并将数量添加回父记录。

我的问题是我有一个自定义HTML资源,它调用OData Post以批量创建订单产品(模拟批量创建),我的脚本循环调用此创建。例如,我可以连续5次调用OData Create来快速创建5个自定义订单产品,或者我可以将其称为10次,具体取决于用户的需求。看起来我的插件正在同时触发,因为从父记录中检索的值有时是相同而不是更新的值。我的意图是每个插件在下一个插件触发/检索数量值之前触发并更新父记录。 如果我创建5个订单产品,每个数量为1,我希望我的父记录减少5个。实际上,它只在5个订单产品创建情况下减1或2。看起来每个插件中的检索组织服务调用必须同时触发以获取旧值。

另一方面,我的删除插件在批量删除情况下完美运行。我可以删除批量删除中的5个订单产品,并且父记录可以正确更新。例如,5个订单产品,每个数量为1,导致父记录更新5。

为什么批量删除的工作方式不同于我多次调用Odata Post。您是否认为将其从插件转移到工作流程是一个更好的解决方案?

谢谢 伊恩

2 个答案:

答案 0 :(得分:1)

您应该使用Plugin Execution Order按照自己的意愿执行插件。

插件中的

Execution order指定了在rank插件中执行的插件,该插件在订单值为pipeline stage.的情况下注册,然后是以2的订单注册的插件,依此类推。但是,如果具有相同订单值的阶段中有多个插件,则首先调用具有最早编译日期的插件

见下方图片

enter image description here

答案 1 :(得分:0)

由于在同一产品同时创建两个或更多订单产品后同时触发插件,您可能会遇到竞争条件。

e.g。 Product Lemon有10件库存商品。      订购产品A订购2个柠檬。      订购产品B订购3个柠檬。

如果产品订单A和B同时触发您的插件,他们将获取Product Lemon的当前库存数量,即10。

两个插件都将从10中扣除(即产品订单A将为10-2,而产品B将为10-3)。取决于谁更新产品柠檬记录最后将是产品柠檬的新库存数量。

解决方案: 使用MUTEX可以防止计算中的竞争条件。 NB 1 :CRM Online环境中无法使用MUTEX。 CRM Online支持 NB 2:(锁定),但not for Cross-Process locking