假设一个这样的场景:
1)新建商机的插件实例A读了一个自定义实体数据C的值100,将会通过计算把这个值更改为200。
2)新建商机的插件实例B在A完成计算前,读了C的值为100。
3) A把200的值保存下来后,B也得出200的值并保存。
Dynamics CRM的Plugin(插件)是运行在一个SQL Transaction里面的。 所以我们能利用这个特性,在插件里面做出简单的读写锁,而不用额外访问SQL server运行query。
这对于做自动计数插件是尤其有效。我们只需要在读取前先做一次更新,就能对数据做出一个读写锁,不会让其他线程读到脏数据。
具体如下:
1)新建商机的插件实例A把商机的GUID更新到C里面的一个字段,然后通过Retrieve再取得C并读C的值100,将会通过计算把这个值更改为200。
2)新建商机的插件实例B在A完成计算前,因为A对C的锁,B在计算完成前不能读C的值,B睡眠
3)A完成对C的更新,放开锁,B读取C的值200, 通过计算得到400并保存到C
虽然这样的插件能保证数据的完整一致,但肯定对性能有影响,对C的操作越频繁影响越大。请根据实际情况来采用。
谢谢阅读!
Jake Zhong