是否可以通过乐观并发来确保这种情况?

时间:2017-03-02 18:23:59

标签: entity-framework concurrency entity-framework-6 optimistic-concurrency

我有一个包含长列的表,这是一个GroupCode。我可以拥有一组产品,所以要获得一个组的所有产品,我只需要获得GroupCode相同的所有产品。

我可以将产品从一个组更改为另一个组,如果我从组中更改产品,我希望该组的所有产品都更改为新组。

如果我使用乐观并发,可能会发生这种情况:

一个用户想要从一个组中更改产品,因此他获得了具有相同groupCode的所有产品。将新的新groupCode设置为所有这些产品。

第二个用户向该组添加新产品。但是第一个用户没有这个产品,因为他在第二个用户添加新产品之前获得了所有产品。

所以最后,新产品的GroupCode错误,因为代码不正确,因为该组的所有产品都更改为新组。所以我会有一个只有一个产品的小组,这是不正确的。

使用悲观并发,第一次使用获取该组的所有产品,阻止所有产品。

第二个用户尝试向该组添加新产品,为此,首先尝试将该组的一个产品作为参考产品,但第一个用户如何阻止它,第二个用户必须等待。

第一个用户将所有产品更改为新组并取消阻止所有产品。

第二个用户获得具有新groupCode的参考产品,因此新产品将添加到正确的组中。

总之,我希望当我将产品从一个组更改为另一个组时,我想要更改该组的所有产品,并避免新产品属于旧组。

是否有可能用乐观并发解决这种情况?或者我必须使用悲观的并发?

1 个答案:

答案 0 :(得分:0)

老实说,我在这里没有看到这个问题。如果您想将其实现为OCC,则应该遵循OCC phases

  1. 用户.fadeInBlock {opacity:0;} 获取属于群组A
  2. 的所有记录
  3. 用户ABC获得B的引用,目前属于Record1
  4. 用户ABCA移至群组Record1
  5. 用户XYZ想要将新记录添加到B所属的组中。因此,在插入记录之前,请获取Record1组,现在是Record
  6. 这假设您使用了参考记录'做法。如果您的屏幕(或其他)只列出当前可用的组,同时其中一个组变空(因为您已将所有记录移动到另一个组),则无法确定是否存在并发问题或者它正在按预期工作。在这种情况下,您应该规范化数据库并将类别拆分为单独的表,以便至少用户收到该组不再存在的错误。