知识库

锁管理器差异说明

进行中

社区

  • 使用 Java 内置锁,即 ’synchronized’。在多处理器机器上可能表现不佳

  • 使用 Thread.sleep() 和 Thread.interrupt() 来等待锁。这会导致上下文切换,成本较高

  • 保留全局图或所有锁以检测死锁。这是需要在每次锁操作时更新的共享数据结构,因此会产生同步开销

  • 为每个新启动的事务创建锁客户端

企业版

  • 使用比较并交换指令(AtomicInteger、AtomicLong)和并发无阻塞数据结构(ConcurrentHashMap)来替代同步。它们应能提供更好的可扩展性

  • 采用自旋等待与 Thread.sleep() 相结合的方式等待锁。理论上可减少上下文切换

  • 没有全局资源来检测死锁。每个锁客户端都有一个本地未同步的位集用于死锁检测。因此不存在需要更新的全局共享资源

  • 对锁客户端进行池化,以便新创建的事务可以直接从线程本地存储中获取

  • 用于死锁检测的位集未同步,却在不同线程中被更新和读取。这种竞争访问是出于性能考虑,但会导致误报的死锁

一般来说,你不需要更改默认的 lock_manager,但如果需要更改,则必须编辑 $NEO4J_HOME/conf/neo4j.conf(3.x)或 $NEO4J_HOME/conf/neo4j.properties(2.x)并加入以下内容

lock_manager=community

然后重新启动 Neo4j。

© . This site is unofficial and not affiliated with Neo4j, Inc.