知识库

锁管理器差异说明

正在进行中

社区

  • 使用 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。