乐观并发是否有可能确保这种情况?

is it possible with optimistic concurrency ensure this case?

我有一个 table,其中有一长列是 GroupCode。我可以有产品组,所以要获得一组的所有产品,我只需要获得 GroupCode 相同的所有产品。

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

如果我使用开放式并发,可能会发生这种情况:

某用户想更换一个组中的产品,所以他得到了具有相同groupCode的所有产品。将新的组代码设置为所有这些产品。

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

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

悲观并发,第一次使用获取组内所有产品,阻塞所有产品

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

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

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

综上所述,我想当我从一个组换一个产品到另一个组时,我想改变该组的所有产品,避免新产品属于旧组。

乐观并发可以解决这个问题吗?或者我必须使用悲观并发?

老实说,我看不出这里有什么问题。如果你想将它实现为 OCC,你应该遵循 OCC phases.

  1. 用户 A 获取属于组 ABC
  2. 的所有记录
  3. 用户 B 获得对 Record1 的引用,该引用目前属于 ABC
  4. 用户 ARecord1 移动到组 XYZ
  5. 用户 B 想要向 Record1 所属的组添加一条新记录。所以就在插入记录之前,获取 Record 的组,现在是 XYZ

这是假设您采用 'referential record' 方法。如果您的屏幕(或其他)仅列出当前可用的组,同时这些组中的一个变为空(因为您已将所有记录移动到另一个组),则无法判断这是并发问题还是正在运行预期的。在这种情况下,您应该规范化您的数据库并将类别拆分为单独的 table,这样至少用户会收到该组不再存在的错误消息。