锁管理器差异解释
正在进行中
社区版
-
使用 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。
此页面有帮助吗?