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

时间:2017-08-16 15:04:24

标签: neo4j cypher spring-data-neo4j neo4j-ogm

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

由唯一客户编号标识的客户节点。 由唯一ISBN标识符标识的产品节点。

我想在一个客户节点与一个产品节点之间创建关联。 但我希望将此关联表示为一个名为许可证节点的新节点,该节点将具有指向客户节点的一个链接以及指向产品 node。

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

我的应用程序中创建新的许可证节点并将它们链接到其他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和客户编号同时到达。 发生这种情况时,我有时会为同一客户产品节点创建重复的许可证节点。 春季数据neo4j中的事务似乎并未阻止这种情况发生。

Example of correctly added License

Example of License added twice

如何确保在Customer节点和Product节点之间只创建一个License节点?

1 个答案:

答案 0 :(得分:0)

  

spring数据neo4j中的事务似乎并没有阻止这种情况发生。

Neo4j已经读取提交的事务隔离级别。为防止这种情况,您需要 serializable

为了实现您的需求,您可以:

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

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

    Customer类似。

  • 向License添加一个特殊键,它是Product和Customer ID的串联 - 然后在其上创建一个唯一约束。