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