我的图表中有以下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节点?
答案 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的串联 - 然后在其上创建一个唯一约束。