Neo4j - 并发问题(锁定/解锁节点)

问题描述 投票:0回答:1

我有一个nodejs项目,存在一些并发问题。我有一个处理程序,它读取更新后的状态,然后将其写入同一节点的 neo4j 数据库。当两个并发进程尝试运行相同的处理程序时,进程从数据库读取状态,然后一个进程将更新后的状态写入另一个进程之上。所以我想在读取之前锁定并在写入之后解锁。

neo4j 有为此准备的东西吗? 我找到了 this 并尝试使用它来读取和写入查询:

// read
MATCH (n:Account {id: $accountId})
CALL apoc.lock.nodes([n])  // Attempt to lock the account node
RETURN account.balance
// write
MATCH (n:Account {id: $accountId})
CALL apoc.lock.nodes([n])  // Lock the account node
SET n.balance = n.balance + $amount
RETURN account
// locks are released here??

但没有结果,也没有足够的文档来了解如何使用它。

任何查询示例都很棒!预先感谢您!

node.js concurrency neo4j locking
1个回答
0
投票

为了提高效率,neo4j 默认使用

read-committed
隔离级别,该级别不会对事务从数据库读取的所有内容加锁。但是,事务写入的数据从事务中的该点开始自动锁定。 请参阅此处了解更多详情。

apoc.lock.nodes

过程在提供的列表中的每个节点上放置写锁,但锁在调用该过程的事务结束时释放。因此,您的“处理程序”必须在“同一事务”中执行您的

read
write
查询,以防止并发执行相互干扰。请参阅适用于您的编程语言的
neo4j 驱动程序
的文档,了解如何在同一事务中处理查询。 此外,您的 write 查询不需要调用

apoc.lock.nodes

,因为紧随其后的

SET
子句无论如何都会锁定
n
节点(如果事务之前没有锁定它)。请参阅
docs
中的直接依赖关系的描述和示例。
    
© www.soinside.com 2019 - 2024. All rights reserved.