知识库

锁管理器差异解释

正在进行中

社区版

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

  • 使用 Thread.sleep() 和 Thread.interrupt() 等待锁。这涉及到上下文切换,开销可能很高

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

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

企业版

  • 使用比较并设置指令 (AtomicInteger, AtomicLong) 和并发非阻塞数据结构 (ConcurrentHashMap) 而非同步。它们应提供更好的扩展性

  • 结合使用忙等待 (busy-wait) 和 Thread.sleep() 来等待锁。这理论上应该减少上下文切换

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

  • 池化锁客户端,因此新创建的事务可以直接从线程本地存储中获取它们

  • 用于死锁检测的位集未同步,但会从不同的线程进行更新和读取。这种竞态访问是为了性能而有意为之,但可能导致误报死锁

一般来说,您不需要更改默认的 lock_manager,但如果需要更改,则需要编辑 $NEO4J_HOME/conf/neo4j.conf (3.x) 或 $NEO4J_HOME/conf/neo4j.properties (2.x) 并包含

lock_manager=community

然后重启 Neo4j。

© . All rights reserved.