我如何保证在交易中的两个现有节点之间只创建一个新的唯一节点

How I guarantee I create only one new unique node between two existing nodes in a transaction

我的图表中有以下 2 个现有节点。

A Customer 节点由唯一的客户编号标识。 由唯一 ISBN 标识符标识的 Product 节点。

我想在一个 Customer 节点和一个 Product 节点之间创建关联。 但我想将此关联表示为一个名为 License 节点的新节点,该节点将有一个 link 到 Customer 节点和一个link 到 Product 节点。

License 节点将有一个作为随机 GUID 生成的新内部标识符。

我在我的应用程序中创建新的 License 节点并将它们 link 发送到其他 2 个节点的逻辑在一个事务中执行。

if (Product NOT already associated with the License for that Customer) create a new License node with a new random GUID create a relationship from the new License Node to the Product Node create a relationship from the Customer Node to the new License Node

但是,多个请求可以同时到达,并且具有相同的 ISBN 和客户编号。 发生这种情况时,我有时会为相同的 CustomerProduct 节点创建重复的 License 节点。 spring data neo4j 中的事务似乎无法阻止这种情况的发生。

Example of correctly added License

Example of License added twice

如何确保在客户节点和产品节点之间只创建一个许可证节点?

The transaction in spring data neo4j does not seem to prevent this from happening.

Neo4j 具有 read committed 事务隔离级别。为了防止这种情况,您需要 serializable.

要实现您的需要,您可以:

  • 在执行 Product NOT already associated with... 检查之前锁定产品和客户节点。您可以使用这样的查询来执行此操作(在同一事务中):

    MATCH (n:Product) WHERE ID(n) = {id} REMOVE n._lock
    

    Customer 类似。

  • 向许可证添加一个特殊密钥,它是产品和客户 ID 的串联 - 然后在其上创建唯一约束。