我正在开发Dynamics CRM 2011,我创建了订单产品创建插件(后期操作)以及订单产品删除插件(预验证)。
创建订单产品时,我的插件会检索父记录并根据订单产品数量更新数量字段。 删除订单产品时,我的删除插件会将其反转并将数量添加回父记录。
我的问题是我有一个自定义HTML资源,它调用OData Post以批量创建订单产品(模拟批量创建),我的脚本循环调用此创建。例如,我可以连续5次调用OData Create来快速创建5个自定义订单产品,或者我可以将其称为10次,具体取决于用户的需求。看起来我的插件正在同时触发,因为从父记录中检索的值有时是相同而不是更新的值。我的意图是每个插件在下一个插件触发/检索数量值之前触发并更新父记录。 如果我创建5个订单产品,每个数量为1,我希望我的父记录减少5个。实际上,它只在5个订单产品创建情况下减1或2。看起来每个插件中的检索组织服务调用必须同时触发以获取旧值。
另一方面,我的删除插件在批量删除情况下完美运行。我可以删除批量删除中的5个订单产品,并且父记录可以正确更新。例如,5个订单产品,每个数量为1,导致父记录更新5。
为什么批量删除的工作方式不同于我多次调用Odata Post。您是否认为将其从插件转移到工作流程是一个更好的解决方案?
谢谢 伊恩
答案 0 :(得分:1)
您应该使用Plugin Execution Order
按照自己的意愿执行插件。
Execution order
指定了在rank
插件中执行的插件,该插件在订单值为pipeline stage.
的情况下注册,然后是以2的订单注册的插件,依此类推。但是,如果具有相同订单值的阶段中有多个插件,则首先调用具有最早编译日期的插件
见下方图片
答案 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。