我实现Neo4j的客户端BG benchmark。有11个功能,模拟11种不同的社交活动。每个函数都有自己的事务主体。但是当我使用100个线程运行时,有时会引发死锁检测异常。Neo4j的死锁
我有用户为节点和友谊的关系。我邀请朋友,拒绝朋友,接受朋友并融合所有有两个用户的朋友作为他们的投入。他们工作的方式是获取一个用户节点的所有关系,并找到与另一个用户节点的关系。
是任何人察觉锁定的Neo4j的机制呢?
我实现Neo4j的客户端BG benchmark。有11个功能,模拟11种不同的社交活动。每个函数都有自己的事务主体。但是当我使用100个线程运行时,有时会引发死锁检测异常。Neo4j的死锁
我有用户为节点和友谊的关系。我邀请朋友,拒绝朋友,接受朋友并融合所有有两个用户的朋友作为他们的投入。他们工作的方式是获取一个用户节点的所有关系,并找到与另一个用户节点的关系。
是任何人察觉锁定的Neo4j的机制呢?
你可以阅读有关在Neo4j documentation死锁。当您对同一实体(节点或关系)进行并发修改时,可能会出现这些错误。请注意,在修改实体时,可能会使用多个锁:例如,对于关系,将采用通过关系连接的两个节点上的锁。
默认锁定行为:
的锁将被添加到该交易,并在交易完成后公布。
BG基准选取两个随机用户,并调用与输入随机的行动之一。但每次选择两个用户时,它会锁定它们,所以其他线程将无法选择这些用户。通过这个我的意思是两个线程不可能选择两个相同的用户。 – user3353973
这将有助于描述你在交易中做什么。僵局可能来自对关系的锁定:假设你有用户A和B,他们有两个共同的朋友C和D:A - C - B和A - D - B。同时移除A和B可能会导致死锁,因为两者都需要C和D上的锁。 – RaduK
有一个用户查看好友列表操作,该操作将锁定该特定用户的所有友谊关系以对其进行计数。假设函数viewFriend(u1)将锁定所有用户u2-u10。同时u2可能想要邀请u10,它需要锁定u2和u10,但它不能!所以我认为这是因为对图的任何访问都会获得相同的锁: - ? – user3353973